《springJMS、activemq中消费者收不到生产者发送的消息的原因解析》由会员分享,可在线阅读,更多相关《springJMS、activemq中消费者收不到生产者发送的消息的原因解析(7页珍藏版)》请在金锄头文库上搜索。
1、spring JMS 、 activemq 中消费者收不到生产者发送的消息的原因解析文章分类 :Java 编程我们使用 jms 一般是使用spring-jms 和 activemq 相结合通过spring 的 JmsTemplate 发送消息到指定的 Destination 。 首先定义一个 activemq 的连接池 Xml 代码 1. 3. 4. 5. 7. 8. 9. 10. 定义 jmsTempalte 的实例 Xml 代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 定义生产者SendMessage.java Java代码1. importjavax.jms.JMS
2、Exception 2. import javax. jms.Message 3. import javax.jms.Session 4. import javax. jms.TextMessage 5. import javax.jms.Topic 6. 7. importorg.springframework. jms.core.JmsTemplate 8. import org.springframework. jms.core.MessageCreator 9. 10.public class SendMessage 11. 12. private JmsTemplate jmsTem
3、plate13. 14. private String topicName 15. 16. private Topic topic 17.18. public void setJmsTemplateJmsTemplate jmsTemplate 19. this.jmsTemplate jmsTemplate 20. 21. 22. public voidsetTopicNameString topicName 23. this.topicName topicName24.31. .createSessionfalse Session.AUTO_ACKNOWLEDGE32. .createTo
4、pictopicName 33. 34. jmsTemplate.sendtopicnewMessageCreator 35. 36. Override 37. public Message createMessageSession session 38. throws JMSException 39. 40. TextMessage textMessage session41. .createTextMessagemessage 42. return textMessage 43. 44.45. catch JMSException e 46. e.printStackTrace 47. 4
5、8. 49. 定义消费者 TestListener.java Java 代码 1. importjavax.jms.JMSException 2. import javax. jms.Message 3. import javax.jms.MessageListener 4. import javax. jms.Session 5. import javax. jms.Topic 6. 7. importorg.springframework. jms.core.JmsTemplate 8. import org.springframework. jms.listener.DefaultMes
6、sageListenerConta iner 9. 10.public class TestListener implements MessageListener11. 12. private JmsTemplate jmsTemplate 13. 14. private String topicName 15. 16. public TestListenerJmsTemplate jmsTemplateString topicName 17. 18. this.jmsTemplate jmsTemplate 19. 20. this.topicName topicName 21. 22. T
7、opictopic 23. try 24. topicSessionfalse 25.26. 27. DefaultMessageListenerContainer dmc new DefaultMessageListenerContainer 28.dmc.setPubSubDomaintrue 29. dmc.setDestinationtopic 30.ory 31. dmc.setPubSubNoLocaltrue 32.dmc.setMessageListenerthis 33.EDGE 34. dmc.initialize 35. dmc.start 36. catch JMSEx
8、ceptione 37. e.printStackTrace 38. 39. 40. 41. Override 42. public void45. 46. 47. 然后在 spring 的配置文件中定义相关的bean:Xml 代码1. 2. 3. 4. 5. 6. 7. 8. 9. 编写测试代码BeanTest.javaJava 代码1. importClassPathXmlApplicationContextinfrastructure-config.xml 7. 8.public static void mainString args 9. 10. SendMessagesendMess
9、age SendMessage context.getBeansendMessage 11. 12.sendMessage.sendMessagehahahha我来测试了13.sendMessage.sendMessagedfsdfsfsdfsdfsdf 14.sendMessage.sendMessagecome on baby 15.sendMessage.sendMessagehahahha我来测试了2 16.sendMessage.sendMessagedfsdfsfsdfsdfsdf2 17.sendMessage.sendMessagecome on baby2 18.sendMe
10、ssage.sendMessagehahahha我来测试了3 19.sendMessage.sendMessagedfsdfsfsdfsdfsdf3 20.sendMessage.sendMessagecome on baby3 21.sendMessage.sendMessagehahahha我来测试了4 22.sendMessage.sendMessagedfsdfsfsdfsdfsdf4 23.sendMessage.sendMessagecome on baby4 24. 25. 但是这个时候会发现消费者是无法接收到消费者消息的。因为我们在定义消费者时定义了以下的代码Java 代码1.
11、DefaultMessageListenerContainer dmc newDefaultMessageListenerContainer 2. dmc.setPubSubDomaintrue3.EDGE 8. dmc.initialize 9. dmc.start上面的代码中的Java 代码 1. dmc.setPubSubNoLocaltrue 当设置 pubSubNoLocal 为true 时消费者不会接收来自同一个连接的消息。因为我们在上面的配置文件中定义了连接池的最大连接数为1 因此每次使用的连接都是同一个连接所以就消费者就接收不到消息。只有当 pubSubNoLocal 为 fa
12、lse 时消费者才能接收到来自同一个连接的消息。当然也可以设置连接池的最大连接数为多个比如为 10 这样就可能不会每次都是用同一个连接消费者也可以接收到消息。但是这样的话不是每个消息都可以接收到因为这样的话不排除有时候消费者和生产者有使用同一个连接的可能。 如果一定要设置pubSubNoLocal 为 true 的话那么就必须要使用不同的连接。在这里也要注意的是: Java代码1. dmc.setPubSubDomaintrue 当消费者要接收topic 的消息时 pubSubDomain 必须设置为true。当消费者要接收queue 的消失时 pubSubDomain 必须设置为false。
13、 当然也可以使用两个不同的连接一个连接被生产者使用另外一个连接被消费者使用。这样的话即使设置Java 代码1.dmc.setPubSubNoLocaltrue pubSubNoLocal 为 true 消费者也可以接收到消息。比如我们再增加一个activemq 的连接池这个连接池的最大连接数为1。 Xml 代码1. 3. 4. 5. 7. 8. 9.10.lt/bean 再定义一个使用该连接池的JmsTemplate Xml 代码 1. 2. 3. 4. 5. 6. lt/bean 修改一下消费者让消费者使用第二个连接池来接收消息Java 代码1. importjavax.jms.JMSExc
14、eption 2. import javax. jms.Message 3. import javax.jms.MessageListener 4. import javax. jms.Session 5. import javax. jms.Topic 6. 7. import org.springframework. jms.core.JmsTemplate 8. importorg.springframework. jms.listener.DefaultMessageListenerConta iner 9. 10.public class TestListener implements MessageListener11. 12. private JmsTemplate jmsTemplate 13. 14. private JmsTemplate jmsTemplate2 15. 16. private String topicName 17.18.30.tory 35. dmc.setPubSubNoLocaltrue 36.dmc.setMessageListenerthis 37.