前言

MQ——Message Queue,中文翻译为“消息队列”,维基百科上的这样描述:

消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自使用者。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的资料,包含发生的时间,输入装置的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列互交。消息会保存在队列中,直到接收者取回它。

实际应用中有多种MQ,包括MSMQ,Active MQ,Jboss MQ等.本文简单介绍.net环境下Active MQ入门。

准备工作

1.下载Active MQ,地址:http://activemq.apache.org/download.html(我下的是ActiveMQ 5.7.0 Release),下载完成后解压缩即可。ActiveMQ是一个开源的JMS服务器;

2.下载NMS,地址:http://activemq.apache.org/nms/download.html。网站提供源码下载,可以根据需要编译成指定.net framework版本。如果下载的是release版本,直接将具体.net版本目录下Apache.NMS.ActiveMQ.dll和Apache.NMS.dll拷贝出来。

Hello ActiveMQ

1.新建空解决方案:HelloActiveMQ.sln

2.在当前解决方案中分别新建两个控制台程序:ConsoleCustomer.csproj(消费者)和ConsoleProcucer.csproj(生产者)。生产者将消息发送给ActiveMQ,然后ActiveMQ将消息推送给符合条件的消费者;

3.在ConsoleCustomer.csproj(消费者)和ConsoleProcucer.csproj(生产者)两个项目中均添加对Apache.NMS.ActiveMQ.dll和Apache.NMS.dll的引用;

4.在ConsoleProcucer项目的program.cs中添加如下代码(代码中已经又注释):

class Program
{
static IConnectionFactory _factory = null;
static IConnection _connection = null;
static ITextMessage _message = null; static void Main(string[] args)
{
//创建工厂
_factory = new ConnectionFactory("tcp://localhost:61616/"); try
{
//创建连接
using (_connection = _factory.CreateConnection())
{
//创建会话
using (ISession session = _connection.CreateSession())
{
//创建一个主题
IDestination destination = new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("topic"); //创建生产者
IMessageProducer producer = session.CreateProducer(destination); Console.WriteLine("Please enter any key to continue! ");
Console.ReadKey();
Console.WriteLine("Sending: "); //创建一个文本消息
_message = producer.CreateTextMessage("Hello AcitveMQ...."); //发送消息
producer.Send(_message, MsgDeliveryMode.NonPersistent, MsgPriority.Normal, TimeSpan.MinValue);
}
} }
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
} Console.ReadLine(); }
}

5.在ConsoleCustomer项目的program.cs中添加如下代码:

class Program
{
static IConnectionFactory _factory = null; static void Main(string[] args)
{
try
{
//创建连接工厂
_factory = new ConnectionFactory("tcp://localhost:61616/");
//创建连接
using (IConnection conn = _factory.CreateConnection())
{
//设置客户端ID
conn.ClientId = "Customer";
conn.Start();
//创建会话
using (ISession session = conn.CreateSession())
{
//创建主题
var topic = new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("topic"); //创建消费者
IMessageConsumer consumer = session.CreateDurableConsumer(topic, "Customer", null, false); //注册监听事件
consumer.Listener += new MessageListener(consumer_Listener); //这句代码非常重要,
//这里没有read方法,Session会话会被关闭,那么消费者将监听不到生产者的消息
Console.Read();
} //关闭连接
conn.Stop();
conn.Close();
} }
catch (Exception ex)
{
Console.Write(ex.ToString());
} } /// <summary>
/// 消费监听事件
/// </summary>
/// <param name="message"></param>
static void consumer_Listener(IMessage message)
{
ITextMessage msg = (ITextMessage)message;
Console.WriteLine("Receive: " + msg.Text);
}

上述代码生成成功后,一个ActiveMQ的入门程序已经完成,接下来便是测试了。

测试

1.启动之前解压过的ActiveMQ程序,在apache-activemq-5.7.0\bin目录下运行activemq.bat批处理文件。运行截图如下:

2.分别运行之前生成的ConsoleProcucer.exe.和ConsoleCustomer.exe,在ConsoleProcucer.exe中根据提示输入任意键。我们便可以检测ConsoleCustomer.exe有没有接收到我们发送的“Hello ActiveMQ”文本。结果如下:

ConsoleProcucer.exe截图

ConsoleCustomer.exe截图

通过验证我们发现通过ActiveMQ发送消息成功。

总结:

1.ConnectionFactory 是连接工厂,负责创建Connection,Connection 负责创建 Session,Session 创建 MessageProducer(用来发消息) 和 MessageConsumer(用来接收消息),Destination 是消息的目的地;

2.Connection一定要调用Start(),才能接收消息。关闭Connection时先调用Stop(),然后再调用Close();

3.Session在接收消息之前不能关闭,否则监听不到消息;

4.Connection,Session不使用时应该及时关闭,避免内存泄露;

5.ActiveMQ支持topic(主题,广播消息)和Queue(队列,点对点消息)。

注:源码中另外提供了winform实现。需要注意的是winform中消息监听事件在接受到消息后,由于当前不是处于UI线程,是不能直接操作Winform UI的,需要使用Invoke,详情请参照源码。

点击下载源代码

ActiveMQ的更多相关文章

  1. Java消息队列--ActiveMq 实战

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  2. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  3. (jms)ActiveMQ 安装配置.

    前言 ActiveMQ他是Apache出品的一个JMS提供者,管理会话和队列,运行在JVM下,支持多种语言,如JAVA,C++,C#,应用协议: OpenWire,Stomp REST,WS Noti ...

  4. node(ActiveMq)

    简单尝试了node下的ActiveMQ 1.下载apache-activemq-5.9.0,执行bat文件: 2.登录http://localhost:8161/admin可查看其管理后台: 3.安装 ...

  5. ActiveMQ的集群方案对比及部署

    转载:http://blog.csdn.net/lifetragedy/article/details/51869032 ActiveMQ的集群 内嵌代理所引发的问题: 消息过载 管理混乱 如何解决这 ...

  6. JMS学习之路(一):整合activeMQ到SpringMVC

    JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以 ...

  7. ActiveMQ消息队列的使用及应用

    这里就不说怎么安装了,直接解压出来就行了. 谢绝转载,作者保留所有权力 目录:  一:JMQ的两种消息模式 1.1:点对点的消息模式 1.2:订阅模式 二:点对点的实现代码 2.1:点对点的发送端 2 ...

  8. 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)

    你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...

  9. Spring下ActiveMQ实战

    MessageQueue是分布式的系统里经常要用到的组件,一般来说,当需要把消息跨网段.跨集群的分发出去,就可以用这个.一些典型的示例就是: 1.集群A中的消息需要发送给多个机器共享: 2.集群A中消 ...

  10. ActiveMQ(li)

    一.ActiveMQ 首先,ActiveMQ不是一个框架,它不是struct,webx,netty这种框架,它更像是tomcat服务器,因为你使用它之前必须启动它,activeMQ和JMS的关系有点类 ...

随机推荐

  1. 美团HD(1)-设置导航栏主题

    自定义一个UINavigationController DJNavigationController.h #import <UIKit/UIKit.h> @interface DJNavi ...

  2. 10个最常见的 HTML5 面试题及答案

    这是选择了10个 HTML5 面试问题并给出了答案.这是 Web 开发人员最常见的面试问题,相信你掌握了这些重要的面试问题后一定会觉得你的理解提高了.一起来看看吧. 您可能感兴趣的相关文章 Web 前 ...

  3. Windows无法完成安装,若要在此计算机上安装Windows,请中心启动安装。

    现在安装系统已经很简单了,我觉得U盘启动的话两步就差不多了, 壹:设置BIOS,将U盘启动作为系统默认启动选项 贰:直接进去大白菜之类的,一键安装... 今天终于看到第三部了, 报错:Windows无 ...

  4. 配置tomcat系统日志--java eclipse

    控制台那里的日志只是部分,有时候报错了我们并没有显示出来,所以需要找到系统日志... 双击tomcat v.80 Service---点击open lauch Configuration--Argum ...

  5. poj Flip Game 1753 (枚举)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27005   Accepted: 11694 Descr ...

  6. SQL分页获取数据

    SQL Server分页 select * from (') t Oracle分页 SELECT * FROM (' ORDER BY MaterialNM) t

  7. JS学习:第二周——NO.4DOM库

    DOM库封装练习 var utils = (function () { var flg = 'getComputedStyle' in window;//惰性思想的运用: function makeA ...

  8. android onCreate中获取view宽高为0的解决方法

    view.post(runnable) 通过post可以将一个runnable投递到消息队列的尾部,然后等待UI线程Looper调用此runnable的时候,view也已经初始化好了. view.po ...

  9. 创建dll教程

    先看我的总结: 总结: 1.头文件中如果想以C形式提供,要判断,如果定义了 _cplusplus, extern "c"{  这里写接口声明 } 2.接口声明中,要表明接口接入点的 ...

  10. [原创]JavaEE在CentOS服务器上的部署

    1.安装rz.sz命令 yum install lrzsz 2.配置环境变量 vi .bash_profile 默认的path:PATH=$PATH:$HOME/.local/bin:$HOME/bi ...