SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解
作者:蛇皮皮蛋 发布时间:2022-01-31 05:29:10
标签: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
上面需要注意的是,如果开启订阅者和发布者模式下面的代码会使 * 失效。
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("发送成功");
}
}
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.最后加上 * 类
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~
但是这样有另外一个问题:如果开启了订阅者和发布者模式则无法发送和接收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("发送成功");
}
}
最后的 * 类:
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就完成了 ,有兴趣的可以自己跑下试试
来源:https://blog.csdn.net/qq_37598011/article/details/81106603


猜你喜欢
- Mybatis基础回顾与高级应用数据库:mysql5.7jdk:15引入依赖<!--引入依赖--> &
- 因项目集成了Redis缓存部分数据,需要在程序启动时将数据加载到Redis中,即初始化数据到Redis。在SpringBoot项目下,即在容
- 本文实例为大家分享了Java猜拳游戏的具体代码,供大家参考,具体内容如下先来看一下效果图: 首先我们创建一个Person类,这个类
- 注解定义: 注解是一种注释机制,它可以注释包、类、方法、变量、参数,在编译器生成类文件时,标注可以被嵌入到字节码中。注解的分类:内置注解Ov
- 博主在初学注解的时候看到网上的介绍大部分都是直接介绍用法或者功能,没有实际的应用场景,篇幅又很长导致学习的时候难以理解其意图,而且学完就忘Q
- 对于一个应用程序而言,控件是搭建用户界面的积木。它们具备交互式的特征。VS 2012中的控件都放在工具箱中,添加一个控件到窗体,只需在工具箱
- Java 存储模型和共享对象详解很多程序员对一个共享变量初始化要注意可见性和安全发布(安全地构建一个对象,并其他线程能正确访问)等问题不是很
- 第一步 环境(UBUNTU系统下)sudo apt-get install mono-gmcs mono第二步 建立example.cscl
- 本文实例为大家分享了Android实现画画板的具体代码,供大家参考,具体内容如下① 准备一个布局文件<?xml version=&qu
- 本文实例为大家分享了Android ViewPager指示器的制作方法,供大家参考,具体内容如下1.概述ViewPageIndicator这
- 1、概述本文通过手动实现迭代器来了解foreach语句的本质。2、使用foreach语句遍历集合在C#中,使用foreach语句来遍历集合。
- 最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不
- 嵌套查询使用Fluent Mybatis, 不用手写一行xml文件或者Mapper文件,在dao类中即可使用java api构造中比较复杂的
- @ConditionalOnMissingBean,它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的
- 本文实例讲述了java实现的冒泡排序算法。分享给大家供大家参考,具体如下:public class PaoPaixu { pub
- Lucene从今天开始,我们要开始介绍Lucene中索引构建的流程。因为索引构建的逻辑涉及到的东西非常多,如果从构建入口IndexWrite
- 这篇文章主要介绍了Jmeter如何添加循环控制器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- java返回json请求中文变成问号原来在个人项目时,用layui的数据表格获取数据时,不会出现中文变问号问题后来换了个项目,发现返回的js
- 简介记录一个利用系统分享功能进行图片分享的工具类(代码是用Kotlin写的,都是比较简单的语法,部分可能需要自定义的地方都已经标出)。调用方
- 在Java中对集合进行操作时,有时候需要对类中的equals() 和 hashCode()进行方法重写.IDEA中实现了利用快捷键即可对上述