首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

在Spring中应用JMS

2012-11-19 
在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 代码

?

  1. <!---->< xml ? version = "1.0" ? encoding = "UTF-8" ?> ?? < server > ??
  2. ?? < mbean ? code = "org.jboss.mq.server.jmx.Topic" ?? ????? name = "jboss.mq.destination:service=Topic,name=kiralJms" > ??
  3. ???? < depends ? optional-attribute-name = "DestinationManager" > jboss.mq:service = DestinationManager depends > ?? ???? < depends ? optional-attribute-name = "SecurityManager" > jboss.mq:service = SecurityManager depends > ??
  4. ???? < attribute ? name = "SecurityConf" > ?? ?????? < security > ??
  5. ???????? < role ? name = "guest" ? read = "true" ? write = "true" /> ?? ???????? < role ? name = "publisher" ? read = "true" ? write = "true" ? create = "false" /> ??
  6. ???????? < role ? name = "durpublisher" ? read = "true" ? write = "true" ? create = "true" /> ?? ?????? security > ??
  7. ???? attribute > ?? ?? mbean > ??
  8. ? server > ???

2:配置发送消息端

bean-jms.xml

xml 代码
  1. <!---->xml ? version = "1.0" ? encoding = "GB2312" ?> ?
  2. < beans > ?? ???? < bean ? id = "jmsConnectionFactory" ??
  3. ???????? class = "org.springframework.jndi.JndiObjectFactoryBean" > ?? ???????? < property ? name = "jndiName" > ??
  4. ???????????? < value > TopicConnectionFactory value > ?? ???????? property > ??
  5. ???? bean > ?? ???? ??
  6. ???? < bean ? id = "destination" ?? ???????? class = "org.springframework.jndi.JndiObjectFactoryBean" > ??
  7. ???????? < property ? name = "jndiName" > ?? ???????????? < value > topic/kiralJms value > ??
  8. ???????? property > ?? ???? bean > ??
  9. ?? ???? <!---->??
  10. ???? < bean ? id = "jmsTemplate" ?? ???????? class = "org.springframework.jms.core.JmsTemplate" > ??
  11. ???????? < property ? name = "connectionFactory" > ?? ???????????? < bean ??
  12. ???????????????? class = "org.springframework.jms.connection.SingleConnectionFactory" > ?? ???????????????? < property ? name = "targetConnectionFactory" ??
  13. ???????????????????? ref = "jmsConnectionFactory" ? /> ?? ???????????? bean > ??
  14. ???????? property > ?? ???? bean > ??
  15. ?? ???? <!---->?<!---->?
  16. ???? < bean ? id = "messageProducer" ?? ???????? class = "jms.MessageProducer" > ??
  17. ???????? < property ? name = "template" ? ref = "jmsTemplate" ? /> ?? ???????? < property ? name = "destination" ? ref = "destination" ? /> ??
  18. ???? bean > ?? beans > ??

?

java 代码
  1. import ?javax.jms.Destination; ?? import ?javax.jms.JMSException; ??
  2. import ?javax.jms.Message; ?? import ?javax.jms.Session; ??
  3. ?? import ?org.springframework.jms.core.JmsTemplate; ??
  4. import ?org.springframework.jms.core.MessageCreator; ?? ??
  5. /*********************************************************** ? ?*?消息发送者 ?
  6. ?*? ? ?*?@作者:kiral ?
  7. ?*?@日期:2007-7-3 ?
  8. ?**********************************************************/ ?? public ? class ?MessageProducer?{ ??
  9. ?? ???? public ? void ?send( final ?String?message)?{ ??
  10. ????????template.send(destination,? new ?MessageCreator()?{ ?? ???????????? public ?Message?createMessage(Session?session)? throws ?JMSException?{ ??
  11. ????????????????Message?m?=?session.createTextMessage(message); ?? ???????????????? return ?m; ??
  12. ????????????} ?? ????????}); ??
  13. ????} ?? ??
  14. ???? private ?JmsTemplate?template; ?? ??
  15. ???? private ?Destination?destination; ?? ??
  16. ???? public ? void ?setDestination(Destination?destination)?{ ?? ???????? this .destination?=?destination; ??
  17. ????} ?? ??
  18. ???? public ? void ?setTemplate(JmsTemplate?template)?{ ?? ???????? this .template?=?template; ??
  19. ????} ?? ??
  20. }??

发送方调用send方法发送消息。

?

3:配置消息接收者

xml 代码
  1. <!---->< xml ? version = "1.0" ? encoding = "UTF-8" ?> ??
  2. <!---->?? < beans > ??
  3. ???? < bean ? id = "jmsConnectionFactory" ?? ???????? class = "org.springframework.jndi.JndiObjectFactoryBean" > ??
  4. ???????? < property ? name = "jndiName" > ?? ???????????? < value > TopicConnectionFactory value > ??
  5. ???????? property > ?? ????< bean > ??
  6. ???? < bean ? id = "destination" ?? ???????? class = "org.springframework.jndi.JndiObjectFactoryBean" > ??
  7. ???????? < property ? name = "jndiName" > ?? ???????????? < value > topic/kiralJms value > ??
  8. ???????? property > ?? ????< bean > ??
  9. ?? ???? <!---->??
  10. ???? < bean ? id = "messageListener" ?? ???????? class = "jms.MessageConsumer" > ??
  11. ???????? < property ? name = "worksheetService" ? ref = "worksheetService" > property > ?? ????< bean > ??
  12. ?? ???? <!---->??
  13. ???? < bean ? id = "listenerContainer" ?? ???????? class = "org.springframework.jms.listener.DefaultMessageListenerContainer" > ??
  14. ???????? < property ? name = "connectionFactory" ? ref = "jmsConnectionFactory" ? /> ?? ???????? < property ? name = "destination" ? ref = "destination" ? /> ??
  15. ???????? < property ? name = "messageListener" ? ref = "messageListener" ? /> ?? ????< bean > ??
  16. < beans > ??

?

java 代码
  1. import ?javax.jms.Message; ?? import ?javax.jms.MessageListener; ??
  2. ?? import org.kiral.flow.service.WorksheetService; ??
  3. ?? /******************************************************************************* ?
  4. ?*?消息接收者 ? ?*? ?
  5. ?*?@作者:kiral ? ?*?@日期:2007-7-3 ? ?******************************************************************************/ ??
  6. public ? class ?MessageConsumer? implements ?MessageListener?{ ?? ??
  7. ???? private ?WorksheetService?worksheetService; ?? ??
  8. ???? public ?WorksheetService?getWorksheetService()?{ ?? ???????? return ?worksheetService; ??
  9. ????} ?? ??
  10. ???? public ? void ?setWorksheetService(WorksheetService?worksheetService)?{ ?? ???????? this .worksheetService?=?worksheetService; ??
  11. ????} ?? ??
  12. ???? public ? void ?onMessage(Message?message)?{ ?? ????????System.out.println(message); ??
  13. ????????worksheetService.updateRole(); ?? ????} ??
  14. ?? }??

接受方一旦接收到消息,就会打印在控制台。

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   对不起,现在工作忙,没有时间做这个例子

热点排行