.Net下对ActiveMQ的使用

  刚来到一个新公司,因为项目需要,要使用ActiveMQ,于是就研究了一下,写下此篇笔记,借鉴了博客园和CSDN的相关资料  

ActiveMQ简介
     ActiveMQ是一个开放源码,基于Apache2.0 licenced的,实现了JMS1.1的消息中间件
一开始不知道什么叫中间件,于是又研究了一下中间件的概念,如果有不了解的可以看下,会的就直接略过。
  中间件(middleware)是一种独立的系统软件或服务程序, 它在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件.
  中间件的作用:具体地说,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。中间件带给应用系统的,不只是开发的简便、开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。
  中间件的分类:中间件所包括的范围十分广泛,针对不同的应用需求涌现出多种各具特色的中间件产品。但至今中间件还没有一个比较精确的定义,因此,在不同的角度或不同的层次上,对中间件的分类也会有所不同。由于中间件需要屏蔽分布环境中异构的操作系统和网络协议,它必须能够提供分布环境下的通讯服务,我们将这种通讯服务称之为平台。基于目的和实现机制的不同,我们将平台分为以下主要几类: 
     远程过程调用(Remote Procedure Call)RPC
     面向消息的中间件(Message-Oriented Middleware)MOM
     对象请求代理(Object Request Brokers)ORB
下面进入主题:
  先从 http://activemq.apache.org/download.html下载MQ的最新版本
ActiveMQ在.Net下的使用:
  1.添加对Apache.NMS.dll和Apache.NMS.ActiveMQ.dll的引用
  
  2.编写Producer生产者代码
 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             try
 6             {
 7                 //创建连接工厂
 8                 IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
 9                 using (IConnection connection = factory.CreateConnection())
10                 {
11                     //创建 Session
12                     using (ISession session = connection.CreateSession())
13                     {
14                         //创建生产者Producer for the topic/queue
15                         IMessageProducer prod = session.CreateProducer(
16                             new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("testing"));                        
17                         //发送消息
18                         int i = 0;
19 
20                         while (!Console.KeyAvailable)
21                         {
22                             ITextMessage msg = prod.CreateTextMessage();
23                             msg.Text = i.ToString();
24                             Console.WriteLine("Sending: " + i.ToString());
25                             prod.Send(msg, Apache.NMS.MsgDeliveryMode.NonPersistent, Apache.NMS.MsgPriority.Normal, TimeSpan.MinValue);
26 
27                             System.Threading.Thread.Sleep(5000);
28                             i++;
29                         }
30                     }
31                 }
32 
33                 Console.ReadLine();
34            }
35             catch (System.Exception e)
36             {
37                 Console.WriteLine("{0}",e.Message);
38                 Console.ReadLine();
39             }
40         }
41     }

  3.编写Consumer消费者代码
 1 class Program
 2 {
 3         static void Main(string[] args)
 4         {
 5             try
 6             {
 7                 //创建连接工厂
 8                 IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
 9                 //创建连接
10                 using (IConnection connection = factory.CreateConnection())
11                 {
12                     connection.ClientId = "testing listener";
13                     connection.Start();
14                     //创建Session
15                     using (ISession session = connection.CreateSession())
16                     {
17                         //创建Consumer
18                         IMessageConsumer consumer = session.CreateDurableConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("testing"), "testing listener", null, false);
19                         //绑定接收消息的事件
20                         consumer.Listener += new MessageListener(consumer_Listener);
21                         Console.ReadLine();
22                        }
23                     connection.Stop();
24                     connection.Close();
25                 }
26             }
27             catch (System.Exception e)
28             {
29                 Console.WriteLine(e.Message);
30             }
31         }
32 
33         static void consumer_Listener(IMessage message)
34         {
35             try
36             {
37                 ITextMessage msg = (ITextMessage)message;
38                 Console.WriteLine("Receive: " + msg.Text);
39            }
40             catch (System.Exception e)
41             {
42                 Console.WriteLine(e.Message);
43             }
44         }
45 }

相关参数说明

5.相关参数
 *(1)连接工厂IConnectionFactory 

    连接工厂是客户用来创建连接的对象。

 *(2)连接Iconnection

          IConnection 封装了客户与服务之间一个虚拟的连接。

 *(3)会话session

     Session是生产和消费消息的一个单线程上下文。会话用于创建消息生产者(producer)、消息消费者(consumer)和消息 (message)等。会话提供了一个事务性的上下文,在这个上下文中,一组发送和接收被组合到了一个原子操作中。

 *(4)目的地

     目的地是客户用来指定它生产的消息的目标和它消费的消息的来源的对象。定义了两种消息传递域:点对点(PTP)消息传递域和发布/订阅消息传递域。

     在点对点消息传递域中,目的地被成为队列(queue);在发布/订阅消息传递域中,目的地被成为主题(topic)。

 *(5)消息生产者producer

     消息生产者是由会话创建的一个对象,用于把消息发送到一个目的地。

 *(6)消息消费者consumer

     消息消费者是由会话创建的一个对象,它用于接收发送到目的地的消息。消息的消费可以采用以下两种方法之一:
           同步消费。通过调用消费者的receive方法从目的地中显式提取消息。receive方法可以一直阻塞到消息到达。

           异步消费。客户可以为消费者注册一个消息监听器,以定义在消息到达时所采取的动作。

   * (7)消息 ITextMessage 

     消息由以下三部分组成:
       消息头。每个消息头字段都有相应的getter和setter方法。
       消息属性。如果需要除消息头字段以外的值,那么可以使用消息属性。
       消息体。定义的消息类型有TextMessage、MapMessage、BytesMessage、StreamMessage和ObjectMessage。
posted @ 2013-10-21 14:12  多线程的奥秘  阅读(2561)  评论(0编辑  收藏  举报