JMS
jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。
简介
JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于 JDBC(Java Database Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象, 由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以 将消息分为几种类型,它们分别携带:简单文本 (TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。
体系架构
JMS对象模型
JMS对象模型包含如下几个要素:[1]
1)连接工厂。连接工厂(ConnectionFactory)是由管理员创建,并绑定到JNDI树中。客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。
2)JMS连接。JMS连接(Connection)表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。
3)JMS会话。JMS会话(Session)表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。
4)JMS目的。JMS目的(Destination),又称为消息队列,是实际的消息源。
5)JMS生产者和消费者。生产者(Message Producer)和消费者(Message Consumer)对象由Session对象创建,用于发送和接收消息。
6)JMS消息通常有两种类型: ① 点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。 ② 发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。
定义connection bean
<bean id="connectionFactory" //it knows how to connect to ActiveMQ(message broker)
class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<propertyname="brokerURL"value="tcp://localhost:61616"/> //where the message broker
is located,jms消息提供者的地址
</bean>
定义消息队列
<bean id="queue"class="org.apache.activemq.command.ActiveMQQueue">
<constructor-argvalue="spitter.queue"/>
</bean>
或者
<bean id="topic"class="org.apache.activemq.command.ActiveMQTopic">
<constructor-argvalue="spitter.topic"/>
</bean>
//send message
ConnectionFactorycf=new ActiveMQConnectionFactory("tcp://localhost:61616");
Connectionconn=null;
Session session=null;
try {
conn =cf.createConnection();//创建连接
session=conn.createSession(false,Session.AUTO_ACKNOWLEDGE); //创建session
Destinationdestination=new ActiveMQQueue("spitter.queue"); //消息队列
MessageProducerproducer=session.createProducer(destination); //创建生产者
TextMessagemessage=session.createTextMessage(); //创建消息
message.setText("Helloworld!");
producer.send(message); //发布
} catch(JMSExceptione){
// handleexception?
} finally{
try {
if (session!=null){
session.close();
}
if (conn!=null){
conn.close();
}
} catch(JMSExceptionex){
}
}
//receive message
ConnectionFactorycf=new ActiveMQConnectionFactory("tcp://localhost:61616");
Connectionconn=null;
Session session=null;
try {
conn =cf.createConnection();
conn.start();
session=conn.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destinationdestination=new ActiveMQQueue("spitter.queue");
MessageConsumerconsumer=session.createConsumer(destination);
Messagemessage=consumer.receive();
TextMessagetextMessage=(TextMessage)message;
System.out.println("GOTAMESSAGE:"+textMessage.getText());
conn.start();
} catch(JMSExceptione){
// handleexception?
} finally{
try {
if (session!=null){
session.close();
}
if (conn!=null){
conn.close();
}
} catch(JMSExceptionex){
}
}
使用jmsTemplate可以简化以上步骤,处理异常
<bean id="jmsTemplate"
class="org.springframework.jms.core.JmsTemplate">
<propertyname="connectionFactory"ref="connectionFactory"/>
<propertyname="defaultDestinationName"
value="spittle.alert.queue"/>
</bean>
//send message
public classAlertServiceImplimplementsAlertService{
public void sendSpittleAlert(finalSpittlespittle){
jmsTemplate.send(
"spittle.alert.queue", //发送到的消息队列,如果jsmTemplate有设置defaultDestinationName,则可以省略这个参数
new MessageCreator(){
public MessagecreateMessage(Sessionsession) throws JMSException{
return session.createObjectMessage(spittle); //ask for an object message from the session, giving it the Spittle object to build
the object message from.
}
}
);
}
@Autowired
JmsTemplatejmsTemplate;
}
//receive message
public SpittlegetAlert(){
try {
ObjectMessagereceivedMessage=(ObjectMessage) jmsTemplate.receive();//Receive message
return(Spittle)receivedMessage.getObject();//Get object
} catch(JMSExceptionjmsException){
throwJmsUtils.convertJmsAccessException(jmsException);
}
}
//唯一一处使用jmstemplate 需要处理异常,由于ObjectMessage’s getObject()抛出
//receive()是同步的
消息监听
<bean id="spittleHandler"
class="com.habuma.spitter.alerts.SpittleAlertHandler"/>
<jms:listener-containerconnection-factory="connectionFactory">
<jms:listenerdestination="spitter.alert.queue"
ref="spittleHandler"method="processSpittle"/>
</jms:listener-container>
public classSpittleAlertHandler{
public voidprocessSpittle(Spittlespittle){
// ...implementationgoeshere...
}
}
参考:
http://uh.9ria.com/space-63908-do-blog-id-7075.html 详解
http://wenku.baidu.com/view/f8af7923ccbff121dd368314.html 技术原理