ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现

一.特性列表

⒈ 多种语言和协议编写客户端。语言: Java,C,C++,C#,Ruby,Perl,Python,PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
⒉ 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
⒊ 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
⒋ 通过了常见J2EE服务器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
⒌ 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
⒍ 支持通过JDBC和journal提供高速的消息持久化
⒎ 从设计上保证了高性能的集群,客户端-服务器,点对点
⒏ 支持Ajax
⒐ 支持与Axis的整合
⒑ 可以很容易得调用内嵌JMS provider,进行测试

二、Jms规范里的两种message传输方式Topic和Queue,两者的对比如下:

Topic
Queue

概要
Publish Subscribe messaging 发布订阅消息
Point-to-Point 点对点

有无状态
topic数据默认不落地,是无状态的。

Queue数据默认会在mq服务器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存储。

完整性保障
并不保证publisher发布的每条数据,Subscriber都能接受到。
Queue保证每条数据都能被receiver接收。

消息是否会丢失
一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了。
Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。

消息发布接收策略
一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息。Sub接收完通知mq服务器
一对一的消息发布接收策略,一个sender发送的消息,只能有一个receiver接收。receiver接收完后,通知mq服务器已接收,mq服务器对queue里的消息采取删除或其他操作。

三、安装

1.首先去http://activemq.apache.org/download.html 下载最新版本

2.解压后,目录如下:

+bin (windows下面的bat和unix/linux下面的sh)

+conf (activeMQ配置目录,包含最基本的activeMQ配置文件)

+data (默认是空的)

+docs (index,replease版本里面没有文档,-.-b不知道为啥不带)

+example (几个例子

+lib (activemMQ使用到的lib)

-apache-activemq-4.1-incubator.jar (ActiveMQ的binary)

-LICENSE.txt

-NOTICE.txt

-README.txt

-user-guide.html

3.使用bin\activemq.bat启动服务

四、创建.Net Producer

   1:      class Program
   2:      {
   3:          static IConnectionFactory _factory = null;
   4:          static IConnection _connection = null;
   5:          static ITextMessage _message = null;
   6:          static ITextMessage _message2 = null;
   7:          static void Main(string[] args)
   8:          {
   9:              //创建工厂
  10:              _factory = new ConnectionFactory("tcp://localhost:61616/");
  11:              try
  12:              {
  13:                  //创建连接
  14:                  using (_connection = _factory.CreateConnection())
  15:                  {
  16:                      //创建会话
  17:                      using (ISession session = _connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
  18:                      {
  19:                          //创建一个主题
  20:                          IDestination destination = new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("topic");
  21:   
  22:                          //创建生产者
  23:                          IMessageProducer producer = session.CreateProducer(destination);
  24:   
  25:                          int counter = 0;
  26:                          Console.WriteLine("请输入你要发送数据,然后回车!");
  27:                          
  28:                          while (true)
  29:                          {
  30:                              string msg = Console.ReadLine();
  31:                              if (msg != string.Empty)
  32:                              {
  33:                                  Console.BackgroundColor = ConsoleColor.Blue;
  34:                                  Console.Beep();
  35:                                  counter++;
  36:                                  
  37:                                  //创建一个文本消息
  38:                                  _message = producer.CreateTextMessage("This is .Net AcitveMQ Message....");
  39:                                  //_message2 = producer.CreateTextMessage("<Root><First>Test</First><Root>");
  40:                                  
  41:                                  Console.WriteLine("正在发送第{0}组发送数据...........", counter);
  42:                                  //发送消息
  43:                                  producer.Send(_message, MsgDeliveryMode.Persistent, MsgPriority.Normal,
  44:                                      TimeSpan.MaxValue);
  45:   
  46:                                  Console.WriteLine("'"+_message.Text+"'已经发送!");
  47:                                  //producer.Send(_message2, MsgDeliveryMode.Persistent, MsgPriority.Normal,
  48:                                  //    TimeSpan.MinValue);
  49:                                  //Console.WriteLine("'" + _message2.Text + "'已经发送!");
  50:                                  producer.Send(msg, MsgDeliveryMode.Persistent, MsgPriority.Normal, TimeSpan.MinValue);
  51:                                  Console.WriteLine("你输入的数据'" + msg + "'已经发送!");
  52:                                  Console.WriteLine("**************************************************");
  53:                                  Console.BackgroundColor = ConsoleColor.Black;
  54:                                  Console.WriteLine("请输入你要发送数据,然后回车!");                                
  55:                              }
  56:                          }                     
  57:                      }
  58:                  }
  59:              }
  60:              catch (Exception ex)
  61:              {
  62:                  Console.WriteLine(ex.ToString());
  63:              }
  64:              Console.ReadLine();
  65:          }
  66:      }

五、创建Java Consumer

   1:  import javax.jms.Connection;
   2:  import javax.jms.ConnectionFactory;
   3:  import javax.jms.Session;
   4:  import javax.jms.TextMessage;
   5:  import javax.jms.Topic;
   6:  import javax.jms.TopicSubscriber;
   7:   
   8:  import org.apache.activemq.ActiveMQConnectionFactory;
   9:   
  10:  public class ActiveMQConsumer {
  11:      public static void main(String[] args) {
  12:          // ConnectionFactory :连接工厂,JMS 用它创建连接
  13:          ConnectionFactory connectionFactory;
  14:          // Connection :JMS 客户端到JMS Provider 的连接
  15:          Connection connection = null;
  16:          // Session: 一个发送或接收消息的线程
  17:          Session session;
  18:          Topic topic;
  19:          // 消费者,消息接收者
  20:          TopicSubscriber subscriber;
  21:          connectionFactory = new ActiveMQConnectionFactory(
  22:                  //ActiveMQConnection.DEFAULT_USER,
  23:                  //ActiveMQConnection.DEFAULT_PASSWORD,
  24:                  "tcp://localhost:61616");
  25:          try {
  26:              // 构造从工厂得到连接对象
  27:              connection = connectionFactory.createConnection();
  28:              connection.setClientID("Customer");
  29:              // 启动
  30:              connection.start();
  31:              // 获取操作连接
  32:              session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);            
  33:              topic = session.createTopic("topic");
  34:              subscriber= session.createDurableSubscriber(topic, "Customer", null, false);
  35:          
  36:              while (true) {
  37:                  //TextMessage message = (TextMessage) subscriber.receive(10000);
  38:                  //TextMessage message = (TextMessage) subscriber.receiveNoWait();
  39:                  TextMessage message= (TextMessage) subscriber.receive();
  40:                  if (null != message) {                    
  41:                      System.out.println("收到消息" + message.getText());
  42:                      
  43:                  } else {
  44:                      break;
  45:                  }
  46:              }
  47:          } catch (Exception e) {
  48:              e.printStackTrace();
  49:          } finally {
  50:              try {
  51:                  if (null != connection)
  52:                      connection.close();
  53:              } catch (Throwable ignore) {
  54:              }
  55:          }
  56:      }    
  57:  }

六、参考资料

http://heisetoufa.iteye.com/blog/1908335

http://www.cnblogs.com/sunwei2012/archive/2010/03/22/1691919.html

http://www.cnblogs.com/tenghoo/archive/2009/11/23/activeMQ_client.html

http://www.cnblogs.com/CopyPaster/archive/2012/04/27/2473179.html

http://blog.csdn.net/gongqingkui/article/details/8615777

http://blog.csdn.net/mypurse/article/details/6265073

使用Active MQ在.net和java系统之间通信的更多相关文章

  1. Java线程之间通信

    用多线程的目的:更好的利用CPU的资源.因为所有的多线程代码都可以用单线程来实现. 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程. 并行:多个CPU实例或者多台机器同时执行一段处理逻辑, ...

  2. java 线程之间通信以及notify与notifyAll区别。

    jvm多个线程间的通信是通过 线程的锁.条件语句.以及wait().notify()/notifyAll组成. 下面来实现一个启用多个线程来循环的输出两个不同的语句. package com.app. ...

  3. java 通过jmx获取active mq队列消息

    一.修改active mq配置文件 修改\conf\activemq.xml,带下划线部分 <!-- Licensed to the Apache Software Foundation (AS ...

  4. Active MQ C++实现通讯记录

    Active MQ  C++实现通讯 背景知识: ActiveMQ是一个易于使用的消息中间件. 消息中间件 我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件(MOM:Message O ...

  5. Java系统监控(淘汰sigar)

    Sigar是Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件.它用来从许多平台收集系统和处理信息. 这些平台包括:Linux, Windows, Solaris, AIX, ...

  6. 架构设计:系统间通信(20)——MQ:消息协议(下)

    (接上文<架构设计:系统间通信(19)--MQ:消息协议(上)>) 上篇文章中我们重点讨论了"协议"的重要性.并为各位读者介绍了Stomp协议和XMPP协议. 这两种协 ...

  7. JMS 之 Active MQ 的消息传输

    本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与Active ...

  8. 初探active mq

    mq(message queue),即消息队列,目前比较流行消息队列是active mq 和kafka.本文介绍如何简单的使用active mq. ActiveMQ官网下载地址:http://acti ...

  9. 系统间通信(5)——IO通信模型和JAVA实践 下篇

    7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用IO 这三种IO模型,以及JAVA对于这三种IO模型的支持.重点说明了IO模型是由操作系统提供支持,且这三种IO模 ...

随机推荐

  1. HDU 5878 I Count Two Three

    I Count Two Three Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  2. java web 学习十(HttpServletRequest对象1)

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...

  3. android 官网处理图片 代码

    /** * 获取压缩后的图片 (官网大图片加载对应代码) * * @param res * @param resId * @param reqWidth * 所需图片压缩尺寸最小宽度 * @param ...

  4. Android中获取应用程序(包)的信息----PackageManager

    本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:   第一部分: 获取应用程序的packagena ...

  5. cocos2d-x 详解之 CCLayer(触摸事件)

    CCLayer继承自CCNode,在CCLayer中可以实现单点触摸.多点触摸和重力感应回调3种不同形式的交互.这部分的难点在于,当存在多个层都要去接收触摸时它的响应机制是如何处理的.了解内部的处理机 ...

  6. [LeetCode] Add Digits (a New question added)

    Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...

  7. git 记录

    在官网有详细的教程http://git-scm.com/book/zh/%E8%B5%B7%E6%AD%A5 查看分支和日志的两个工具:gitk 和 tig ,两个都有 --all 参数,可以查看所有 ...

  8. Tkinter教程之Label篇

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811293 #Tkinter教程之Label篇'''1.Label的第一个例子text属性使用 ...

  9. 把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进)

    #把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进) ##背景 项目中经常需要把JSON数据填充到页面表单,一开始我使用easyui自带的form load方法,觉得效率很低,经 ...

  10. SRM DIV1 500pt DP

    SRM 501 DIV1 500pt SRM 502 DIV1 500pt SRM 508 DIV1 500pt SRM 509 DIV1 500pt SRM 511 DIV1 500pt SRM 5 ...