关于ActiveMQ的一些学习和资料整理。
消息中间件
中间件类型概述
三种类型
- 基于远程过程调用 (Remote Procedure Call, RPC) 的中间件,允许一个应用程序中的过程调用远程应用程序中的过程,就好像它们是本地调用一样。该中间件实现一个查找远程过程的链接机制并使调用方能够以透明方式使用这些过程。以前,这种类型的中间件处理基于过程的程序;现在,它还包括基于对象的组件。
- 基于对象请求代理 (Object Request Broker, ORB) 的中间件,使应用程序的对象能够在异类网络之间分布和共享。ORB 负责完成查找请求的对象实现、让对象实现准备好接收请求、传递构成请求的数据等完成远程调用时底层通信任务所需的全部机制。
- 消息的中间件或基于 MOM 的中间件,使分布式应用程序可以通过发送和接收消息来进行通信和交换数据。
3. 面向
总结
所有这些模型都使一个软件组件可以通过网络影响另一个组件的行为。它们的区别在于基于 RPC 和 ORB 的中间件会创建紧密耦合组件系统,而基于 MOM 的系统允许组件进行更松散的耦合。在基于 RPC 或 ORB 的系统中,一个过程调用另一个过程时,必须等待调用的过程返回才能执行其他操作。正如前面所提到的,在这些模型中,中间件在一定程度上充当超级链接程序,在网络上查找被调用过程,并使用网络服务将函数或方法参数传递到被调用过程,然后返回查找结果。
RPC的局限性
- 同步通信:客户端调用后,必须等待服务对象完成处理并返回结果后才能继续执行;
- 客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程都必须正常运行;如果由于服务对象奔溃或者网络故障导致客户的请求不可达,客户会接收到异常。
- 点对点通信:客户的一次调用只能发送给某个单独的目标对象。
MOM(面向消息的中间件 Message Oriented Middleware,MOM)较好的解决了以上问题。
发送者将 消息转发给接收者。这种模式下,发送和接收是异步的,发送者无需等待;二者的生命周期未必相同:发送消息的时候接受者不一定运行,接收消息的时候发送者也不一定运行;一对多通信:对于一个消息可以有多个接收者。
JMS
简介
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API。
实现jms接口的消息中间件称为JMS Provider,已有的MOM系统包括Apache的ActiveMQ\以及阿里巴巴的RocketMQ、IBM的MQSeries、Microsoft的MSMQ,BEA的RabbitMQ等等。[BEA系统有限公司,著名的Java中间件软件公司,美国NASDAQ上市公司,其中间件市场份额一度比IBM 还要高。2008年初被Oracle 收购。]
JMS术语
在提到JMS时,我们通常会说到一些术语,解释如下:
1. 消息中间件(JMS Provider) : 指提供了对JMS协议的第三方组件,比如ActiveMQ就是一个消息中间件,另外比较知名的还有KFA, Rabbit MQ等。
2. 消息模式:分为点对点(Point to Point,即P2P)和发布/订阅(Pub/Sub),对应的数据结构分别是队列(Queue)和主题(Topic)
3. 消息(Message): 通信内容的载体,其结构主要分为消息头,属性和消息体,并且根据存储结构的不同分为好几种,后面会详细提到。
4. 消息生产者:产生消息的一方,在P2P模式下,指消息发送者(Sender),在P/S模式下指消息发布者(Publisher)
5. 消息消费者:接收消息的一方,对应于两种模式分别是消息接收者(Receiver)和消息订阅者(Subscriber)
在JMS的标准协议里,有几个重要的接口,先简单罗列如下:
1. ConnectionFactory :创建Connection的工厂,通过这个对象来创建一个到某个消息服务的连接。
- Connection: 一个具体的连接,由ConnectionFactory创建。
3. Session: 由Connection创建的用于操作消息的接口,本接口可以直接用来创建消息的生产者对象。
4. Destination:消息存储的位置,发送者把消息发送到指定位置,消费者从指定位置取消息,那么这个指定位置可能是一个topic也可能是一个queue,由这个来表示。
5. MessageProducer: 消息的生产者,包括QueueSender和TopicPublisher。
6. MessageConsumer: 消息的消费者, 包括QueueReceiver和TopicSubscriber。
7. MessageListener: 消息监听器,这个是提供给消费者监听消息使用的,在添加了某个监听器之后,一旦消费到达,则会调用其onMessage方法。

