在Spring中应用JMS
在Spring中使用JMS什么是JMS?JMS即java消息服务,JMS通过消息的形式来降低组件之间的耦合度。JMS由两部分组
在Spring中使用JMS
什么是JMS?
JMS即java消息服务,JMS通过消息的形式来降低组件之间的耦合度。
JMS由两部分组成消息发送者和消息监听者。
?
JMS的运用场景?
?? 用户系统负责维护用户信息,文档系统负责维护文档信息,但是当用户删除的时候,需要将他所撰写的文档信息也删除的时候,在用户管理模块调用文档管理模块的接口,会造成用户模块和业务模块紧耦合。
???这个时候可以使用JMS技术来将紧耦合转化为松耦合,具体做法是用户系统在删除,修改用户的时候往JMS服务器发送更新消息,又业务系统监听这些消息,然后按照自己的业务逻辑来进行相应的处理。
?? 即组件A做了一件事情往消息服务器上发送了一个通知,组件B监听到了消息,处理自己的业务逻辑。
?
详细步骤:
1:配置消息服务器:配置JMS需要两个对象connectionFactory和?destination。
connectionFactory使用jboss自带的TopicConnectionFactory。
destination可以使用自定义的。
kiral-jms-service.xml?? 注意:文件名称一定要是-service.xml结尾。这个文件放在部署目录下。
?
xml 代码
?
- <!---->< xml ? version = "1.0" ? encoding = "UTF-8" ?> ?? < server > ??
- ?? < mbean ? code = "org.jboss.mq.server.jmx.Topic" ?? ????? name = "jboss.mq.destination:service=Topic,name=kiralJms" > ??
- ???? < depends ? optional-attribute-name = "DestinationManager" > jboss.mq:service = DestinationManager depends > ?? ???? < depends ? optional-attribute-name = "SecurityManager" > jboss.mq:service = SecurityManager depends > ??
- ???? < attribute ? name = "SecurityConf" > ?? ?????? < security > ??
- ???????? < role ? name = "guest" ? read = "true" ? write = "true" /> ?? ???????? < role ? name = "publisher" ? read = "true" ? write = "true" ? create = "false" /> ??
- ???????? < role ? name = "durpublisher" ? read = "true" ? write = "true" ? create = "true" /> ?? ?????? security > ??
- ???? attribute > ?? ?? mbean > ??
- ? server > ???
2:配置发送消息端
bean-jms.xml
xml 代码
- <!---->xml ? version = "1.0" ? encoding = "GB2312" ?> ?
- < beans > ?? ???? < bean ? id = "jmsConnectionFactory" ??
- ???????? class = "org.springframework.jndi.JndiObjectFactoryBean" > ?? ???????? < property ? name = "jndiName" > ??
- ???????????? < value > TopicConnectionFactory value > ?? ???????? property > ??
- ???? bean > ?? ???? ??
- ???? < bean ? id = "destination" ?? ???????? class = "org.springframework.jndi.JndiObjectFactoryBean" > ??
- ???????? < property ? name = "jndiName" > ?? ???????????? < value > topic/kiralJms value > ??
- ???????? property > ?? ???? bean > ??
- ?? ???? <!---->??
- ???? < bean ? id = "jmsTemplate" ?? ???????? class = "org.springframework.jms.core.JmsTemplate" > ??
- ???????? < property ? name = "connectionFactory" > ?? ???????????? < bean ??
- ???????????????? class = "org.springframework.jms.connection.SingleConnectionFactory" > ?? ???????????????? < property ? name = "targetConnectionFactory" ??
- ???????????????????? ref = "jmsConnectionFactory" ? /> ?? ???????????? bean > ??
- ???????? property > ?? ???? bean > ??
- ?? ???? <!---->?<!---->?
- ???? < bean ? id = "messageProducer" ?? ???????? class = "jms.MessageProducer" > ??
- ???????? < property ? name = "template" ? ref = "jmsTemplate" ? /> ?? ???????? < property ? name = "destination" ? ref = "destination" ? /> ??
- ???? bean > ?? beans > ??
?
java 代码
- import ?javax.jms.Destination; ?? import ?javax.jms.JMSException; ??
- import ?javax.jms.Message; ?? import ?javax.jms.Session; ??
- ?? import ?org.springframework.jms.core.JmsTemplate; ??
- import ?org.springframework.jms.core.MessageCreator; ?? ??
- /*********************************************************** ? ?*?消息发送者 ?
- ?*? ? ?*?@作者:kiral ?
- ?*?@日期:2007-7-3 ?
- ?**********************************************************/ ?? public ? class ?MessageProducer?{ ??
- ?? ???? public ? void ?send( final ?String?message)?{ ??
- ????????template.send(destination,? new ?MessageCreator()?{ ?? ???????????? public ?Message?createMessage(Session?session)? throws ?JMSException?{ ??
- ????????????????Message?m?=?session.createTextMessage(message); ?? ???????????????? return ?m; ??
- ????????????} ?? ????????}); ??
- ????} ?? ??
- ???? private ?JmsTemplate?template; ?? ??
- ???? private ?Destination?destination; ?? ??
- ???? public ? void ?setDestination(Destination?destination)?{ ?? ???????? this .destination?=?destination; ??
- ????} ?? ??
- ???? public ? void ?setTemplate(JmsTemplate?template)?{ ?? ???????? this .template?=?template; ??
- ????} ?? ??
- }??
发送方调用send方法发送消息。
?
3:配置消息接收者
xml 代码
- <!---->< xml ? version = "1.0" ? encoding = "UTF-8" ?> ??
- <!---->?? < beans > ??
- ???? < bean ? id = "jmsConnectionFactory" ?? ???????? class = "org.springframework.jndi.JndiObjectFactoryBean" > ??
- ???????? < property ? name = "jndiName" > ?? ???????????? < value > TopicConnectionFactory value > ??
- ???????? property > ?? ????< bean > ??
- ???? < bean ? id = "destination" ?? ???????? class = "org.springframework.jndi.JndiObjectFactoryBean" > ??
- ???????? < property ? name = "jndiName" > ?? ???????????? < value > topic/kiralJms value > ??
- ???????? property > ?? ????< bean > ??
- ?? ???? <!---->??
- ???? < bean ? id = "messageListener" ?? ???????? class = "jms.MessageConsumer" > ??
- ???????? < property ? name = "worksheetService" ? ref = "worksheetService" > property > ?? ????< bean > ??
- ?? ???? <!---->??
- ???? < bean ? id = "listenerContainer" ?? ???????? class = "org.springframework.jms.listener.DefaultMessageListenerContainer" > ??
- ???????? < property ? name = "connectionFactory" ? ref = "jmsConnectionFactory" ? /> ?? ???????? < property ? name = "destination" ? ref = "destination" ? /> ??
- ???????? < property ? name = "messageListener" ? ref = "messageListener" ? /> ?? ????< bean > ??
- < beans > ??
?
java 代码
- import ?javax.jms.Message; ?? import ?javax.jms.MessageListener; ??
- ?? import org.kiral.flow.service.WorksheetService; ??
- ?? /******************************************************************************* ?
- ?*?消息接收者 ? ?*? ?
- ?*?@作者:kiral ? ?*?@日期:2007-7-3 ? ?******************************************************************************/ ??
- public ? class ?MessageConsumer? implements ?MessageListener?{ ?? ??
- ???? private ?WorksheetService?worksheetService; ?? ??
- ???? public ?WorksheetService?getWorksheetService()?{ ?? ???????? return ?worksheetService; ??
- ????} ?? ??
- ???? public ? void ?setWorksheetService(WorksheetService?worksheetService)?{ ?? ???????? this .worksheetService?=?worksheetService; ??
- ????} ?? ??
- ???? public ? void ?onMessage(Message?message)?{ ?? ????????System.out.println(message); ??
- ????????worksheetService.updateRole(); ?? ????} ??
- ?? }??
接受方一旦接收到消息,就会打印在控制台。
1 楼 crabboy 2007-09-03 能否提供有消息发送时,及时打印到页面上的例子? 2 楼 eamon 2007-10-19 我也用SPRING JMS + ACTIVEMQ做了异步收发的例子,但测试的时候,发现数据好不理想,发送端每秒也只能发50条的消息,接收服务器倒是没有性能上的问题,不知道是什么原因引起了.JMS的性能不会如此差吧.不知道谁有测试过的性能报告..... 3 楼 crabboy 2007-10-22 建议搞个打印到页面的例子 4 楼 fantasy 2007-10-23 对不起,现在工作忙,没有时间做这个例子