转自百度百科:
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对象模型
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://blog.csdn.net/kkdelta/article/details/5604218
http://uh.9ria.com/space-63908-do-blog-id-7075.html 详解
http://wenku.baidu.com/view/f8af7923ccbff121dd368314.html 技术原理