SpringBoot集成JmsTemplate(隊列模式和主題模式)及xml和JavaConfig配置詳解
1.導入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)
#設置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ā)布者模式下面的代碼會使監(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.服務層代碼:
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~
但是這樣有另外一個問題:如果開啟了訂閱者和發(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">
<!--連接池,內部引入一個連接工廠-->
<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>
<!--測試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>
<!--配置隊列消息容器-->
<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;
}
}
控制臺代碼為:
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就完成了 ,有興趣的可以自己跑下試試
總結
到此這篇關于SpringBoot集成JmsTemplate(隊列模式和主題模式)及xml和JavaConfig配置詳解的文章就介紹到這了,更多相關SpringBoot集成JmsTemplate內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MyBatis使用Zookeeper保存數(shù)據(jù)庫的配置可動態(tài)刷新的實現(xiàn)代碼
這篇文章主要介紹了MyBatis使用Zookeeper保存數(shù)據(jù)庫的配置,可動態(tài)刷新,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
解決springboot報錯Failed?to?parse?multipart?servlet?request
在使用SpringBoot開發(fā)時,通過Postman發(fā)送POST請求,可能會遇到因臨時目錄不存在而導致的MultipartException異常,這通常是因為OS系統(tǒng)(如CentOS)定期刪除/tmp目錄下的臨時文件,解決方案包括重啟項目2024-10-10
Java異常處理 Throwable實現(xiàn)方法解析
這篇文章主要介紹了Java異常處理 Throwable實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
Java swing框架實現(xiàn)的貪吃蛇游戲完整示例
這篇文章主要介紹了Java swing框架實現(xiàn)的貪吃蛇游戲,結合完整實例形式分析了java使用swing框架結合awt圖形繪制實現(xiàn)貪吃蛇游戲的具體步驟與相關實現(xiàn)技巧,需要的朋友可以參考下2017-12-12
Java版數(shù)據(jù)結構插入數(shù)據(jù)時遇到的結點為空的問題詳解
這篇文章主要介紹了Java版數(shù)據(jù)結構插入數(shù)據(jù)時遇到的結點為空的問題及解決辦法,需要的朋友們可以學習下。2019-09-09

