JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
JMS的通用接口集合以异步方式发送或接收消息。
1、JMS由以下元素组成
JMS提供者:连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。
JMS客户:生产或消费消息的基于Java的应用程序或对象。
JMS生产者:创建并发送消息的JMS客户。
JMS消费者:接收消息的JMS客户。
JMS消息:包括可以在JMS客户之间传递的数据的对象
JMS队列:一个容纳那些被发送的等待阅读的消息的区域。队列暗示,这些消息将按照顺序发送。一旦一个消息被阅读,该消息将被从队列中移走。
JMS主题:一种支持发送消息给多个订阅者的机制。
2、JMS模型
点对点或队列模型:如果应用程序开发者希望每一条消息都能够被处理,那么应该使用P2P消息模型。
发布者/订阅者模型:如果一定程度的消息传递的不可靠性可以被接受的话,那么应用程序开发者也可以使用Pub/Sub消息模型。
3、消息传递方式
NON_PERSISTENT:消息最多投递一次,此方式为默认方式。 —— JMS提供者服务重启后消息会丢失
PERSISTENT:消息将使用暂存后再转送的机理投递。 —— JMS提供者服务重启后消息不会丢失
4、消息正文格式
StreamMessage:Java原始值的数据流
MapMessage:一套名称-值对
TextMessage:一个字符串对象
ObjectMessage:一个序列化的 Java对象
BytesMessage:一个未解释字节的数据流
5、JMS应用程序接口
ConnectionFactory 接口(连接工厂):用户用来创建到JMS提供者的连接的被管对象。
Connection 接口(连接):连接代表了应用程序和消息服务器之间的通信链路。
Destination 接口(目标):目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题。
MessageConsumer 接口(消息消费者):由会话创建的对象,用于接收发送到目标的消息。
消息消费者接收消息的方式有两种:
1)同步方式:consumer.receive() 或 consumer.receive(int timeout):消息的接收者会一直等待下去,直到有消息到达,或者超时。
2)异步方式:注册一个MessageListener:注册一个监听器,当有消息到达的时候,会回调它的onMessage()方法。
MessageProducer 接口(消息生产者):由会话创建的对象,用于发送消息到目标。
Message 接口(消息):是在消费者和生产者之间传送的对象。
一个消息有三个主要部分:
消息头(必须):包含用于识别和为消息寻找路由的操作设置。
一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。
一个消息体(可选):允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息)。
Session 接口(会话):表示一个单线程的上下文,用于发送和接收消息。
如果session被标记为transactional,当一个事务被提交时,确认自动发生。
如果session没有标记为transactional,有三个用于消息确认的选项:
AUTO_ACKNOWLEDGE:session将自动地确认收到一则消息。
CLIENT_ACKNOWLEDGE:客户通过消息的acknowledge方法确认消息。需要注意的是,在这种模式中,确认是在会话层上进行:确认一个被消费的消息将自动确认所有已被会话消 费的消息。例如,如果一个消息消费者消费了10个消息,然后确认第5个消息,那么所有10个消息都被确认。
DUPS_OK_ACKNOWLEDGE:该选择只是会话迟钝的确认消息的提交。如果JMS provider失败,那么可能会导致一些重复的消息。如果是重复的消息,那么JMS provider必须把消息头的JMSRedelivered字段设置为true。
6、JMS提供者实现:
Apache ActiveMQ
BEA的BEA WebLogic Server JMS
IBM的WebSphere MQ