现在的位置: 首页 > 综合 > 正文

Spring对JMS的支持

2016年08月24日 ⁄ 综合 ⁄ 共 5323字 ⁄ 字号 评论关闭

JMS两个主要概念:

消息中介

消息目标:

1、队列

2、主题

两种传递模式:

点对点消息传递模型:每个消息都有一个发送者和一个消费者    
发送者-〉队列-〉接受者
发布-订阅者消息传递模型:一条订阅信息,可以发送给多个订阅者
发布者-〉主题-〉订阅者们

JMS优点:

不用等待
面向消息
位置独立
确保投送

ActiveQM:开源消息中介。

Spring中安装ActiveMQ

创建连接工厂:

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
 <property name = "brokerURL" value="tcp://localhost:61616"/>
</bean>
声明ActiveMQ消息目标:消息目标可以是队列,也可以是主题。
队列:
<bean id="mqiqeDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="mqiqe.queue"/>
</bean>
主题:
<bean id="mqiqeDestination" class="org.apache.activemq.command.ActiveMQTopic">
  <constructor-arg index="0" value="mqiqe.topic"/>
</bean>

使用JMS模板:

JmsTemplate是Spring消除冗长和重复JMS代码解决方案。
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory" ref="connectionFactory"/>
  <!--注入默认消息目标-->
  <property name="defaultDestination" ref="mqiqeDestination"/>
</bean>

发送消息:

jmsTemplate.send(destination, messageCreator);方法发送消息 destination:目标 ,messageCreator: 消息。
发送者——〉send(JmsTemplate)——〉队列/主题

消费消息:

MapMessage message=(MapMessage)jmsTemplate.receive(destination);方法接受消息 destination:目标 ,MapMessage: 消息。
队列/主题-〉(recive)JmsTemplate-〉Receiver

Demo代码

spring配置文件:

[html] view
plain
copy

  1.    <!-- ActiveMQ -->  
  2. <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
  3.  <property name = "brokerURL" value="tcp://localhost:61616"/>  
  4. </bean>  
  5. <bean id="mqiqeDestination" class="org.apache.activemq.command.ActiveMQQueue">  
  6.    <constructor-arg index="0" value="mqiqe.queue"/>  
  7. </bean>  
  8. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
  9.   <property name="connectionFactory" ref="connectionFactory"/>  
  10.    <property name="defaultDestination" ref="mqiqeDestination"/>  
  11. </bean>  
  12. <bean id="mqiqeSend" class="com.activemq.MqiqeSendImpl">  
  13.   <property name="jmsTemplate" ref="jmsTemplate"/>  
  14. </bean>  
  15. <bean id="mqiqeReceiver" class="com.activemq.MqiqeReceiverImpl">  
  16.   <property name="jmsTemplate" ref="jmsTemplate"/>  
  17. </bean>  




接口文件:

[java] view
plain
copy

  1. package com.activemq;  
  2.   
  3.   
  4. import javax.jms.JMSException;  
  5.   
  6.   
  7. public interface IMqiqeReceiver {  
  8. public String reveiver() throws JMSException;  
  9. }  
  10. package com.activemq;  
  11.   
  12.   
  13. public interface IMqiqeSend {  
  14. public void send(final String  messageStr);  
  15. }  




类文件:

[java] view
plain
copy

  1. package com.activemq;  
  2.   
  3.   
  4. import javax.jms.Destination;  
  5. import javax.jms.JMSException;  
  6. import javax.jms.MapMessage;  
  7.   
  8.   
  9. import org.springframework.jms.core.JmsTemplate;  
  10.   
  11.   
  12. public class MqiqeReceiverImpl implements IMqiqeReceiver {  
  13. @Override  
  14. public String reveiver() throws JMSException {  
  15. System.out.println("开始接受信息。。。");  
  16. MapMessage message = (MapMessage) jmsTemplate.receive();  
  17. String str = "lastName:" + message.getString("lastName") + "firstName:"  
  18. + message.getString("firstName") + "messageStr:"  
  19. + message.getString("messageStr");  
  20. System.out.println("接受完信息。。。");  
  21. return str;  
  22. }  
  23.   
  24.   
  25. private JmsTemplate jmsTemplate;  
  26.   
  27.   
  28. /** 
  29. * @param jmsTemplate 
  30. *            the jmsTemplate to set 
  31. */  
  32. public void setJmsTemplate(JmsTemplate jmsTemplate) {  
  33. this.jmsTemplate = jmsTemplate;  
  34. }  
  35. }  



[java] view
plain
copy

  1. package com.activemq;  
  2.   
  3.   
  4. import javax.jms.Destination;  
  5. import javax.jms.JMSException;  
  6. import javax.jms.MapMessage;  
  7. import javax.jms.Message;  
  8. import javax.jms.Session;  
  9.   
  10.   
  11. import org.springframework.jms.core.JmsTemplate;  
  12. import org.springframework.jms.core.MessageCreator;  
  13.   
  14.   
  15. public class MqiqeSendImpl implements IMqiqeSend {  
  16.   
  17. @Override  
  18. public void send (final String motorist){  
  19. jmsTemplate.send(  
  20. new MessageCreator(){  
  21. public Message createMessage(Session session) throws JMSException{  
  22. MapMessage message =session.createMapMessage();  
  23. message.setString("lastName""fg\n");  
  24. message.setString("firstName""mqiqe\n");  
  25. message.setString("messageStr", motorist);  
  26. return message;  
  27. }  
  28. });  
  29. }  
  30. private JmsTemplate jmsTemplate;  
  31. /** 
  32. * @param jmsTemplate the jmsTemplate to set 
  33. */  
  34. public void setJmsTemplate(JmsTemplate jmsTemplate) {  
  35. this.jmsTemplate = jmsTemplate;  
  36. }  
  37. }  




测试文件:

[java] view
plain
copy

  1. <pre name="code" class="java">package com.activemq;  
  2.   
  3. import javax.jms.JMSException;  
  4.   
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7.   
  8.   
  9. public class TestActiveMQ {  
  10.     static String context = null;  
  11.     static ApplicationContext applicationContext;  
  12.     static {  
  13.         context = "applicationContext.xml";  
  14.   
  15.     }  
  16.   
  17.     public static void main(String[] arg) {  
  18.         System.out.println("start---");  
  19.         applicationContext = new ClassPathXmlApplicationContext(context);  
  20.         IMqiqeSend demoSend = (IMqiqeSend) applicationContext.getBean("mqiqeSend");  
  21.         IMqiqeReceiver mqiqeReceiver=  (IMqiqeReceiver)applicationContext.getBean("mqiqeReceiver");  
  22.         System.out.println(demoSend);  
  23.         demoSend.send("hello,world!");  
  24.         System.out.println("send Message:hello,world!");  
  25.         try {  
  26.             System.out.println(mqiqeReceiver.reveiver());  
  27.         } catch (JMSException e) {  
  28.             // TODO Auto-generated catch block  
  29.             e.printStackTrace();  
  30.         }  
  31.         System.out.println("end");  
  32.     }  
  33. }  
  34. </pre><br>  
  35. <pre></pre>  
  36. <br>  
  37. <br>  
  38. <br>  
  39. <span style="white-space:pre"></span>  
  40. <pre name="code" class="java"></pre>  
  41. <br>  
  42. <br>  
  43. <span style="color:#ff0000">(注:在运行之前要先运行ActiveMQ)</span>
     

抱歉!评论已关闭.