消息队列与JMS

什么是消息队列以及消息队列的好处?
顾名思义,消息队列就是一个保存传输消息的容器。
使用消息队列的意义可参考:http://www.oschina.net/translate/top-10-uses-for-message-queue
简单的总结几句:消息队列使得消息的生产者和消息的消费者之间解耦,生产者不需要知道是谁消费了自己产生的消息,同样消费者也一样;
这种好处使得两者之间能异步通信,生产者只需管发送消息,消费者只需管消费消息;
利用消息队列可以缓存消息,极大提高了执行的效率;
还有通过消息中间件,可以使得两者(生产者与消费者)使用不同的语言编码,等等。

java中的消息队列规范JMS
JMS规范使得生产者与消费者之间可异步进行通信。
JMS有两种消息模型:点对点(point to point)和发布/订阅(publish/subscribe)模式。下面就简单介绍下两种模型:
点对点模型
简单来说就是消息的生产者将消息发送到消息队列中(queue),然后消费者从消息队列(queue)中取出消息消费;一个消息只能被一个消费者消费,被消费的消息将会从queue中清除。
queue:是点对点模式中存储消息的容器。
发布/订阅模型
发布订阅模型与点对点模型的区别是一个消息可以被多个消费者消费,发布者发布一个消息,所有订阅该消息的订阅者都会收到该消息。在发布/订阅模型中,消息被存储的容器叫topic。
queue与topic的区别:
topic和queue的最大区别在于topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息;而queue则是以点对点的形式通知多个处于监听状态的客户端中的一个;两者应用场景有所区别。
JMS编程模型
JMS中的两者模型应该不难理解,其编程模型也很好容易懂,下面我将我的理解以图的形式展示出来:
JMS编程模型
上图描述了JMS创建消息队列的基本API操作流程,首先利用消息中间件(ActiveMQ)获取连接工厂实例,然后由工厂创建连接,连接创建会话,Session会在生产者与消息队列(Destination)之间建立一个会话,用于发送消息,同样也可在消费者和消息队列(Destination)之间建立会话来获取消息。
JMS中还提供监控消息的监听器(图中没有描述出来),当监听器监听消息队列中是否有消息发送进来,若有,可通知消费者消费。

ActiveMQ 在上面我们提到了连接工厂是由消息中间件产生的,ActiveMQ就是一个基于JMS的消息中间件。 消息中间件:指利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。 中间件一般来说对于用户是透明的,有关ActiveMQ的详细介绍可以参考相关书籍和资料。