SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解
1.導(dǎo)入jar包:
<!--jmsTemplate--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> </dependency>
2.填寫配置文件(application.properties)
#設(shè)置JMS(AMQ) spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin spring.activemq.pool.enabled=true #spring.jms.pub-sub-domain=true spring.activemq.pool.max-connections=50 spring.activemq.pool.expiry-timeout=10000 spring.activemq.pool.idle-timeout=30000
上面需要注意的是,如果開啟訂閱者和發(fā)布者模式下面的代碼會(huì)使監(jiān)聽器失效。
3.編寫控制器代碼
@RestController @RequestMapping("/Jms") public class ProducerController { @Autowired private JmsProducerService jmsProducerService; @RequestMapping("/send") public void contextLoads() throws InterruptedException { Destination destination = new ActiveMQQueue("mytest.queue"); for(int i=0; i<10; i++){ jmsProducerService.sendMessage(destination, "我是超人啊"); } System.out.println("發(fā)送成功"); } }
4.服務(wù)層代碼:
package com.zzf.finals.service.impl; import com.zzf.finals.service.JmsProducerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.stereotype.Service; import javax.jms.Destination; @Service public class JmsProducerServiceImpl implements JmsProducerService { @Autowired private JmsTemplate jmsTemplate; @Override public void sendMessage(Destination destination, String message) { this.jmsTemplate.convertAndSend(destination,message); } }
5.最后加上監(jiān)聽器類
package com.zzf.finals.domain; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class Consumer { @JmsListener(destination = "mytest.queue") public void receiveQueue(String text) { System.out.println("Message:"+text); } }
OK~
但是這樣有另外一個(gè)問題:如果開啟了訂閱者和發(fā)布者模式則無法發(fā)送和接收queue消息。
這里我提供兩種寫法xml和java配置:
首先貼上我的xml配置代碼
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--連接池,內(nèi)部引入一個(gè)連接工廠--> <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> <property name="connectionFactory"> <bean class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL"> <value>tcp://localhost:61616</value> </property> </bean> </property> <property name="maxConnections" value="100"></property> </bean> <bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg name="name" value="spring-queue"/> </bean> <!--測(cè)試Topic--> <bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg name="name" value="spring-topic"/> </bean> <!--配置消息容器--> <bean id="TopicContainers" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory"> <property name="pubSubDomain" value="true"/> <property name="connectionFactory" ref="jmsFactory"/> </bean> <!--配置隊(duì)列消息容器--> <bean id="QueueContainers" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory"> <property name="connectionFactory" ref="jmsFactory"/> </bean> </beans>
JavaConfig配置為:
package com.zzf.finals.domain; import org.apache.activemq.command.ActiveMQQueue; import org.apache.activemq.command.ActiveMQTopic; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerContainerFactory; import javax.jms.ConnectionFactory; import javax.jms.Queue; import javax.jms.Topic; @Configuration public class JmsConfig { public final static String TOPIC = "topic.test"; public final static String QUEUE = "queue.test"; @Bean public Queue queue() { return new ActiveMQQueue(QUEUE); } @Bean public Topic topic() { return new ActiveMQTopic(TOPIC); } // topic模式的ListenerContainer @Bean public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setPubSubDomain(true); bean.setConnectionFactory(activeMQConnectionFactory); return bean; } // queue模式的ListenerContainer @Bean public JmsListenerContainerFactory<?> jmsListenerContainerQueue(ConnectionFactory activeMQConnectionFactory) { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setConnectionFactory(activeMQConnectionFactory); return bean; } }
控制臺(tái)代碼為:
package com.zzf.finals.controller; import com.zzf.finals.service.JmsProducerService; import org.apache.activemq.command.ActiveMQQueue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.jms.Destination; import javax.jms.Queue; import javax.jms.Topic; @RestController @RequestMapping("/Jms") public class ProducerController { @Autowired private JmsProducerService jmsProducerService; @Autowired private Topic topic; @Autowired private Queue queue; @Autowired private Topic destinationTopic; @Autowired private Queue destinationQueue; @RequestMapping("/send3") public void testJms2() { for (int i=0;i<10;i++) { jmsProducerService.sendMessage(destinationQueue,"queue,world!" + i); jmsProducerService.sendMessage(destinationTopic, "topic,world!" + i); } } @RequestMapping("/send2") public void testJms() { for (int i=0;i<10;i++) { jmsProducerService.sendMessage(queue,"queue,world!" + i); jmsProducerService.sendMessage(topic, "topic,world!" + i); } } @RequestMapping("/send") public void contextLoads() throws InterruptedException { Destination destination = new ActiveMQQueue("mytest.queue"); for(int i=0; i<10; i++){ jmsProducerService.sendMessage(destination, "我是超人啊"); } System.out.println("發(fā)送成功"); } }
最后的監(jiān)聽器類:
package com.zzf.finals.domain; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class Consumer { @JmsListener(destination = "mytest.queue") public void receiveQueue(String text) { System.out.println("Message:"+text); } @JmsListener(destination = JmsConfig.TOPIC,containerFactory = "jmsListenerContainerTopic") public void onTopicMessage(String msg) { System.out.println("topic:"+msg); } @JmsListener(destination = JmsConfig.QUEUE,containerFactory = "jmsListenerContainerQueue") public void onQueueMessage(String msg) { System.out.println("queue:"+msg); } @JmsListener(destination = "spring-topic",containerFactory = "TopicContainers") public void onTopicMessageXML(String msg) { System.out.println("topic1:"+msg); } @JmsListener(destination = "spring-topic",containerFactory = "TopicContainers") public void onTopicMessageXML2(String msg) { System.out.println("topic2:"+msg); } @JmsListener(destination = "spring-queue",containerFactory = "QueueContainers") public void onQueueMessageXML(String msg) { System.out.println("queue:"+msg); } }
OK~JmsTemplate的使用和配置Demo就完成了 ,有興趣的可以自己跑下試試
總結(jié)
到此這篇關(guān)于SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解的文章就介紹到這了,更多相關(guān)SpringBoot集成JmsTemplate內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)的漢語拼音工具類完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的漢語拼音工具類,結(jié)合完整實(shí)例形式分析了java基于pinyin4j包實(shí)現(xiàn)編碼轉(zhuǎn)換的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Day14基礎(chǔ)不牢地動(dòng)山搖-Java基礎(chǔ)
這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08MyBatis使用Zookeeper保存數(shù)據(jù)庫的配置可動(dòng)態(tài)刷新的實(shí)現(xiàn)代碼
這篇文章主要介紹了MyBatis使用Zookeeper保存數(shù)據(jù)庫的配置,可動(dòng)態(tài)刷新,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08解決springboot報(bào)錯(cuò)Failed?to?parse?multipart?servlet?request
在使用SpringBoot開發(fā)時(shí),通過Postman發(fā)送POST請(qǐng)求,可能會(huì)遇到因臨時(shí)目錄不存在而導(dǎo)致的MultipartException異常,這通常是因?yàn)镺S系統(tǒng)(如CentOS)定期刪除/tmp目錄下的臨時(shí)文件,解決方案包括重啟項(xiàng)目2024-10-10Java異常處理 Throwable實(shí)現(xiàn)方法解析
這篇文章主要介紹了Java異常處理 Throwable實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10Java swing框架實(shí)現(xiàn)的貪吃蛇游戲完整示例
這篇文章主要介紹了Java swing框架實(shí)現(xiàn)的貪吃蛇游戲,結(jié)合完整實(shí)例形式分析了java使用swing框架結(jié)合awt圖形繪制實(shí)現(xiàn)貪吃蛇游戲的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12一個(gè)簡單的SpringBoot項(xiàng)目快速搭建詳細(xì)步驟
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,下面這篇文章主要給大家介紹了一個(gè)簡單的SpringBoot項(xiàng)目快速搭建詳細(xì)步驟,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Java版數(shù)據(jù)結(jié)構(gòu)插入數(shù)據(jù)時(shí)遇到的結(jié)點(diǎn)為空的問題詳解
這篇文章主要介紹了Java版數(shù)據(jù)結(jié)構(gòu)插入數(shù)據(jù)時(shí)遇到的結(jié)點(diǎn)為空的問題及解決辦法,需要的朋友們可以學(xué)習(xí)下。2019-09-09