使用Active MQ在.net和java系统之间通信
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系统之间通信的更多相关文章
- Java线程之间通信
		
用多线程的目的:更好的利用CPU的资源.因为所有的多线程代码都可以用单线程来实现. 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程. 并行:多个CPU实例或者多台机器同时执行一段处理逻辑, ...
 - java 线程之间通信以及notify与notifyAll区别。
		
jvm多个线程间的通信是通过 线程的锁.条件语句.以及wait().notify()/notifyAll组成. 下面来实现一个启用多个线程来循环的输出两个不同的语句. package com.app. ...
 - java 通过jmx获取active mq队列消息
		
一.修改active mq配置文件 修改\conf\activemq.xml,带下划线部分 <!-- Licensed to the Apache Software Foundation (AS ...
 - Active MQ  C++实现通讯记录
		
Active MQ C++实现通讯 背景知识: ActiveMQ是一个易于使用的消息中间件. 消息中间件 我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件(MOM:Message O ...
 - Java系统监控(淘汰sigar)
		
Sigar是Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件.它用来从许多平台收集系统和处理信息. 这些平台包括:Linux, Windows, Solaris, AIX, ...
 - 架构设计:系统间通信(20)——MQ:消息协议(下)
		
(接上文<架构设计:系统间通信(19)--MQ:消息协议(上)>) 上篇文章中我们重点讨论了"协议"的重要性.并为各位读者介绍了Stomp协议和XMPP协议. 这两种协 ...
 - JMS 之 Active MQ 的消息传输
		
本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与Active ...
 - 初探active mq
		
mq(message queue),即消息队列,目前比较流行消息队列是active mq 和kafka.本文介绍如何简单的使用active mq. ActiveMQ官网下载地址:http://acti ...
 - 系统间通信(5)——IO通信模型和JAVA实践 下篇
		
7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用IO 这三种IO模型,以及JAVA对于这三种IO模型的支持.重点说明了IO模型是由操作系统提供支持,且这三种IO模 ...
 
随机推荐
- sql基本语句
			
---恢复内容开始--- 查询有几个不同的职位名称: select distinct name from a: group by: 现在有两个表product和sales,字段分别如下: TABLES ...
 - gcc编译器与基本类型3
			
C语言发展史 1969年贝尔实验室 肯尼斯·蓝·汤普逊,丹尼斯·李奇开发了B语言 ->Unix,New B语言,改名C语言83年提出C语言标准 1989年十二月正式通过C语言标准,C89标准 C ...
 - java易混淆概念之类变量、成员变量、局部变量
			
类变量.成员变量.局部变量 类变量(也叫静态变量)是类中独立于方法之外的变量,用static 修饰.(static表示“全局的”.“静态的”,用来修饰成员变量和成员方法,或静态代码块(静态代码块独 ...
 - window.parent 判断是否是被嵌入iframe里面
			
项目中有个这样逻辑:B页面嵌套A页面 如图下: 但是B页面有可能独立出来.所以判断B页面是否被嵌入进去则使用 window.parent==window 如果是true B页面是独立的,false B ...
 - [HIve - LanguageManual] Join Optimization (不懂)
			
Join Optimization Join Optimization Improvements to the Hive Optimizer Star Join Optimization Star S ...
 - Oauth2 接口api
			
weibo:http://open.weibo.com/wiki/API weixin:http://mp.weixin.qq.com/wiki/home/index.html qq开发平台: 1 ...
 - homework-04
			
1.准备工作 本次结对编程我们对项目本身就行了分工,既然是测试来驱动开发,那么我们就把本次工作分成了测试与生成两个部分,小明同学负责生成测试数据,而我写测试程序检测测试结果是否正确,相对来说还是小明同 ...
 - BAT-使用BAT生成快捷方式
			
@( echo [InternetShortcut] echo URL=C:\Windows\System32\calc.exe echo IconIndex=0 echo IconFile=C:\W ...
 - ocp 1Z0-051 106-140题解析
			
106. Examine the data inthe LIST_PRICE and MIN_PRICE columns of the PRODUCTS table: LIST_PRICE MIN_P ...
 - 条件编译#ifdef的妙用详解_透彻
			
这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部 分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条 ...