首先你得了解什么是MOM: MOM(Message Oriented Middleware),分布式系统的集成,指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通讯来进行分布式系统的集成。
javascript
而后你得知道什么是JMS: JMS(Java Message Service)Java消息服务,应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通讯。
java
摘要来自百度百科,这里就不对前两个进行赘述,有兴趣的自行Google。 :cherries:git
其实也就是为何要使用MQ。 :watermelon:github
异步通讯 不须要即时处理的业务,将其放去消息队列中,在须要处理的时候直接去队列中取出来,达到了生产者和消费者不用互相了解对方,生产者只须要专一于生产,消费者专一于消费。服务器
解耦 下降工程之间的耦合程度,从设计角度来说,达到低耦合高内聚的目的。当应用须要维护的时候,不一样应用能够独立的扩展或修改,只须要遵循一样的接口约束便可。session
冗余 消息队列能够对队列中的消息进行持久化处理,防止数据丢失。不少消息队列都采用“插入-获取-删除”的模式,只有当处理数据的过程成功而且返回提示,才会进行消息的删除,不然消息将一直保存在队列之中。异步
过载保护 在请求量突发的高峰期间,为了让系统保持正常工做,又不想每时每刻都按最大峰值投入资源。使用消息队列就可让关键组件顶住突发压力,不至于让整个系统崩溃。socket
保证有序 消息队列能够对消息进行优先级设定,而后根据优先级来对消息进行排序,达到重要数据优先处理。tcp
缓冲 消息队列有助于控制和优化数据流通过系统的速度。以调节系统响应时间。分布式
数据流处理 大数据业务须要对数据流进行分析,在消息队列中进行处理是最好不过的。
两种运行模型
ActiveMQ的组成模块
ActiveMQ的经常使用协议
AMQP协议 AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消 息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不一样产品,不一样开发语言等条件的限制。
MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时 通信协议,有可能成为物联网的重要组成部分。该协议支持全部平台,几乎能够把全部联网 物品和外部链接起来,被用来当作传感器和致动器(好比经过Twitter让房屋联网)的通讯协 议。
STOMP协议 STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为 MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提 供一个可互操做的链接格式,容许客户端与任意STOMP消息代理(Broker)进行交互。
OPENWIRE协议 ActiveMQ特有的协议,官方描述以下 OpenWire is our cross language Wire Protocol to allow native access to ActiveMQ from a number of different languages and platforms. The Java OpenWire transport is the default transport in ActiveMQ 4.x or later. For other languages see the following...
对于ActiveMQ的上述协议,每种协议端口都不同,能够自行修改。:tangerine:
编辑activemq.xml,在transportConnectors标签中注销、修改或删除不使用的协议。
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
复制代码
csharp做为生产者实例。
//根据URI建立NMS链接工厂
NMSConnectionFactory factory = new NMSConnectionFactory(brokerUri);
//根据用户名密码建立链接
IConnection connection = factory.CreateConnection(user, password);
//打开链接
connection.Start();
//建立Session
ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
//根据destination建立主题
IDestination dest = session.GetQueue(destination);
//建立生产者
IMessageProducer producer = session.CreateProducer(dest);
producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
//发送消息
String body = "hello,javaJMS!! I'm C#";
producer.Send(session.CreateTextMessage(body));
//关闭链接
connection.Close();
复制代码
建立Session时能够为会话设定消息确认模式:
相关实践在这里不进行详细描述,详情能够参考个人Demo项目。:lemon: 以ActiveMQ为消息中间件,关联dotnet,java,ws三种平台