springJMS、activemq中消費者收不到生產(chǎn)者發(fā)送的消息的原因解析.doc_第1頁
springJMS、activemq中消費者收不到生產(chǎn)者發(fā)送的消息的原因解析.doc_第2頁
springJMS、activemq中消費者收不到生產(chǎn)者發(fā)送的消息的原因解析.doc_第3頁
springJMS、activemq中消費者收不到生產(chǎn)者發(fā)送的消息的原因解析.doc_第4頁
springJMS、activemq中消費者收不到生產(chǎn)者發(fā)送的消息的原因解析.doc_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、spring JMS 、 activemq 中消費者收不到生產(chǎn)者發(fā)送的消息的原因解析文章分類 :Java 編程我們使用 jms 一般是使用spring-jms 和 activemq 相結(jié)合通過spring 的 JmsTemplate 發(fā)送消息到指定的 Destination 。 首先定義一個 activemq 的連接池 Xml 代碼 1. 3. 4. 5. 7. 8. 9. 10. 定義 jmsTempalte 的實例 Xml 代碼 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 定義生產(chǎn)者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. 25. 26. public void sendMessagefinal String message 27. 28.

4、try 29. if topic null 30. topic jmsTemplate.getConnectionFactory.createConnection31. .createSessionfalse Session.AUTO_ACKNOWLEDGE32. .createTopictopicName 33. 34. jmsTemplate.sendtopicnewMessageCreator 35. 36. Override 37. public Message createMessageSession session 38. throws JMSException 39. 40. T

5、extMessage textMessage session41. .createTextMessagemessage 42. return textMessage 43. 44.45. catch JMSException e 46. e.printStackTrace 47. 48. 49. 定義消費者 TestListener.java Java 代碼 1. importjavax.jms.JMSException 2. import javax. jms.Message 3. import javax.jms.MessageListener 4. import javax. jms.S

6、ession 5. import javax. jms.Topic 6. 7. importorg.springframework. jms.core.JmsTemplate 8. import org.springframework. jms.listener.DefaultMessageListenerConta iner 9. 10.public class TestListener implements MessageListener11. 12. private JmsTemplate jmsTemplate 13. 14. private String topicName 15.

7、16. public TestListenerJmsTemplate jmsTemplateString topicName 17. 18. this.jmsTemplate jmsTemplate 19. 20. this.topicName topicName 21. 22. Topictopic 23. try 24. topicthis.jmsTemplate.getConnectionFactory.createConnection.createSessionfalse 25.Session.AUTO_ACKNOWLEDGE.createTopicthis.topicName26.

8、27. DefaultMessageListenerContainer dmc new DefaultMessageListenerContainer 28.dmc.setPubSubDomaintrue 29. dmc.setDestinationtopic 30.dmc.setConnectionFactorythis.jmsTemplate.getConnectionFactory 31. dmc.setPubSubNoLocaltrue 32.dmc.setMessageListenerthis 33.dmc.setSessionAcknowledgeModeSession.AUTO_

9、ACKNOWLEDGE 34. dmc.initialize 35. dmc.start 36. catch JMSExceptione 37. e.printStackTrace 38. 39. 40. 41. Override 42. public voidonMessageMessage message 43. 44. System.out.printlnmessage45. 46. 47. 然后在 spring 的配置文件中定義相關(guān)的bean:Xml 代碼1. 2. 3. 4. 5. 6. 7. 8. 9. 編寫測試代碼BeanTest.javaJava 代碼1. importorg.

10、springframework.context.ApplicationContext 2. import org.springframework.context.support.ClassPathXmlApplication Context 3. 4. public class BeanTest 5. 6. public static ApplicationContext context newClassPathXmlApplicationContextinfrastructure-config.xml 7. 8.public static void mainString args 9. 10

11、. SendMessagesendMessage SendMessage context.getBeansendMessage 11. 12.sendMessage.sendMessagehahahha我來測試了13.sendMessage.sendMessagedfsdfsfsdfsdfsdf 14.sendMessage.sendMessagecome on baby 15.sendMessage.sendMessagehahahha我來測試了2 16.sendMessage.sendMessagedfsdfsfsdfsdfsdf2 17.sendMessage.sendMessageco

12、me on baby2 18.sendMessage.sendMessagehahahha我來測試了3 19.sendMessage.sendMessagedfsdfsfsdfsdfsdf3 20.sendMessage.sendMessagecome on baby3 21.sendMessage.sendMessagehahahha我來測試了4 22.sendMessage.sendMessagedfsdfsfsdfsdfsdf4 23.sendMessage.sendMessagecome on baby4 24. 25. 但是這個時候會發(fā)現(xiàn)消費者是無法接收到消費者消息的。因為我們在定義

13、消費者時定義了以下的代碼Java 代碼1.DefaultMessageListenerContainer dmc newDefaultMessageListenerContainer 2. dmc.setPubSubDomaintrue3. dmc.setDestinationtopic 4. dmc.setConnectionFactorythis.jmsTemplate2.getConnectionFac tory 5. dmc.setPubSubNoLocaltrue 6. dmc.setMessageListenerthis 7.dmc.setSessionAcknowledgeMod

14、eSession.AUTO_ACKNOWLEDGE 8. dmc.initialize 9. dmc.start上面的代碼中的Java 代碼 1. dmc.setPubSubNoLocaltrue 當(dāng)設(shè)置 pubSubNoLocal 為true 時消費者不會接收來自同一個連接的消息。因為我們在上面的配置文件中定義了連接池的最大連接數(shù)為1 因此每次使用的連接都是同一個連接所以就消費者就接收不到消息。只有當(dāng) pubSubNoLocal 為 false 時消費者才能接收到來自同一個連接的消息。當(dāng)然也可以設(shè)置連接池的最大連接數(shù)為多個比如為 10 這樣就可能不會每次都是用同一個連接消費者也可以接收到消息

15、。但是這樣的話不是每個消息都可以接收到因為這樣的話不排除有時候消費者和生產(chǎn)者有使用同一個連接的可能。 如果一定要設(shè)置pubSubNoLocal 為 true 的話那么就必須要使用不同的連接。在這里也要注意的是: Java代碼1. dmc.setPubSubDomaintrue 當(dāng)消費者要接收topic 的消息時 pubSubDomain 必須設(shè)置為true。當(dāng)消費者要接收queue 的消失時 pubSubDomain 必須設(shè)置為false。 當(dāng)然也可以使用兩個不同的連接一個連接被生產(chǎn)者使用另外一個連接被消費者使用。這樣的話即使設(shè)置Java 代碼1.dmc.setPubSubNoLocaltru

16、e pubSubNoLocal 為 true 消費者也可以接收到消息。比如我們再增加一個activemq 的連接池這個連接池的最大連接數(shù)為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.JMSException 2. import javax. jms.Message 3. import javax.jms.MessageListener 4. imp

17、ort 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 JmsTe

18、mplate jmsTemplate2 15. 16. private String topicName 17.18. public TestListenerJmsTemplate jmsTemplateString topicNameJmsTemplate jmsTemplate2 19. 20. this.jmsTemplate jmsTemplate 21. 22. this.topicName topicName 23. 24. this.jmsTemplate2 jmsTemplate2 25. 26. Topic topic 27. try 28. topic this.jmsTemplate.getConnectionFactory.createConnection.create Sessionfalse 29. Session.AUTO_ACKNOWLEDGE.createTopicthis.topicName30.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論