Java消息服务 (java Message Service,简称JMS)是用于访问企业消息系统的开发商中立的API。企业消息系统可以协助应用软件通过网络进行消息交互。
JMS的编程过程很简单,概括为:应用程序A发生一条消息到消息服务器的某个目的地,然后消息服务器把消息转发给应用程序B。因为应用程序A和应用程序B没有直接的代码关联,所以两者实现了解耦。
JMS中的消息
消息传递系统的中心就是消息。一条Message由三个部分组成:
头,属性和主体。
消息有下面几种类型,他们都是派生自Message接口。
StreamMessage:一种主体中包含Java基元值流的消息。其填充和读取均按顺序进行。
MapMessage:一种主体中包含一组名-值对的消息。没有定义条目顺序。
TextMessage:一种主体中包含Java字符串的消息(例如,XML消息)
ObjectMessage:一种主体中包含序列化Java对象的消息
BytesMessage:一种主体中包含连续字节流的消息。
消息的传递模型 :
JMS支持两种消息传递模型:点对点,发布/订阅。这两种消息传递模型非常相似,但有以下区别。
1,点对点(point-to-point,简称PTP)
PTP消息传递模型规定了一条消息只能传递给一个接收方。采用javax.jms.Queue表示。
2,发布/订阅(publish/subscribe)
Pub/sub消息传递模型允许一条消息传递给多个接收方。采用javax.jms.Topic表示。
这两种模型都通过扩展公用基类来实现。例如:javax.jms.Queue和javax.jms.Topic都扩展自javax.jms.Destination类。
配置目标地址
开始JMS编程前,我们需要先配置消息到达的目标地址,因为只有目标地址存在了,我们才能发送消息到这个地址。由于每个应用服务器关于目标地址的配置方式都有所不同,下面以jboss为例,配置一个queue类型的目标地址。
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=foshanshop">
<attribute name="JNDIName">queue/foshanshop</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>
Jboss使用一个XML文件配置队列地址,文件的取名格式应遵守*-service.xml
<attribute name="JNDIName">属性指定了该目标地址的全局JNDI名称。如果你不指定JNDIName属性,jboss会为你生成一个默认的全局JNDI,其名称由“queue”+“/”+目标地址名称组成。另外在任何队列或主题被部署之前,应用服务器必须先部署Destination Manager Mbean,所以我们通过<depends>节点声明这一依赖。
采用消息驱动Bean (Message Driven Bean)接收消息
消息驱动Bean(MDB)是设计用来专门处理基于消息请求的组件。它和无状态session bean一样也使用了实例池技术,容器可以使用一定数量的bean实例并发处理成百上千个JMS消息。正因为MDB具有处理大量并发消息的能力,所以非常适合应用在一些消息网关产品。如果一个业务执行的时间很长,而执行结果无需实时向用户反馈时,也很适合使用MDB。如订单成功后给用户发送一封电子邮件或发送一条短信等。
一个MDB通常要实现MessageListener接口,该接口定义了onMessage()方法。Bean通过它来处理收到的JMS消息。
package javax.jms;
public interface MessageListener{
public void onMessage(Message message);
}
当容器检测到bean守候的目标地址有消息到达时,容器调用onMessage()方法,将消息作为参数传入MDB。MDB在onMessage()中决定如何处理该消息。你可以使用注释指定MDB监听哪一个目标地址。当MDB部署时,容器将读取其中的配置信息。