背景
当前,CORBA,DCOM,RMI等RPC中间件技术已广泛应用于各个领域。但是面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性:
1. 同步通信:客户发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行
2. 客户和服务对象的生命周期紧密耦合;客户进程和服务进程都必须正常进行;如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户会接收到异常
3. 点对点通信:客户的一次调用只发送给某个单独的目标对象
面向消息的中间件(MOM)较好的解决了以上问题。发送者将消息发送给消息服务器,消息服务器将消息存放在若干个队列中,在合适的时候再将消息转发给接收者。这种模式下,发送和接收是异步,发送者无需等待,二者的生命周期未必相同;发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信:对于一个消息可以有多个接收着。
java消息服务(JMS)定义了java中访问消息中间件的接口。JMS只是接口并没有给予实现,实现JMS接口的消息中间件称为JMS Provider,已有的MOM系统包括ActiveMQ,阿里的RocketMQ,BEA的RabbitMQ。。。他们基本遵循JMS规范
JMS
JMS术语概念
ConnectionFactory接口(连接工厂)###
用户用来创建JMS提供者的连接的被管对象。
Connection接口(连接)###
连接代表了应用程序和消息服务器之间的通信链路。在获得了连接工厂后,就可以创建一个与JMS提供者的连接。根据不同的连接类型,连接允许用户创建会话,以及发送和接收队列和主题到目标。
Destination接口(目标)###
目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者队列,或者是主题,JMS管理员创建这些对象然后用户通过JNDI发现他们。和连接工厂一样,管理员可以创建两种类型的目标,点对点模型的队列,以及发布订阅模型的主题
session接口(会话)###
表示一个单线程的上下文,用于发送和接收消息。由于会话是单线程,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收。会话的好处是他支持事务。如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息。在提交事务之前,用户可以使用回滚操作取消这些消息。一个会话允许用户创建消息生产者来发送消息,创建消息消费者来接收消息。
MessageConsumer接口(消息消费者)###
由会话创建的对象,用于接收发送到目标的消息。消费者可以同步地(阻塞模式,receive()方法),或者异步(非阻塞,设置监听接口,重写onMessage()方法)接收队列和主题类型的消息
MessageProducer接口(消息生产者)###
由会话创建的对象,用于发送消息到目标。用户可以创建某个目标的发送者,也可创建一个通用的发送者。在发送消息是指定目标。
Message接口(消息)###
是在消费者和生产者之间传送的对象。一个消息有三个主要部分:
消息头(必须):包含用于识别和为消息寻找路由的操作设置。
一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)
一个消息体(可选):允许用户创建五种类型的消息(文本消息,映射消息,对象消息,流消息,字节消息)。
StreamMessage:java原始的数据流
MapMessage:一个名称-值对
TextMessage:一个字符串对象
ObjectMessage:一个序列化的java对象
ByteMessage:一个字节的数据流。