热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springboot集成ativemq

背景:如果你想在springboot中使用activemq,你可以有两个选择,第一个就是使用内置的activemq,还可以使

背景:

       如果你想在springboot中使用activemq,你可以有两个选择,第一个就是使用内置的activemq,还可以使用外部的activemq,我在这里主要使用了外部的activemq,我是在windows下部署的activemq,不要忘记先启动它。

第一步:添加maven依赖

org.springframework.bootspring-boot-starter-activemq


org.apache.activemqactivemq-pool

第二步:配置applicaiton.properties配置文件

#配置activemq的连接地址
spring.activemq.broker-url=tcp://127.0.0.1:61616
#配置用户名
spring.activemq.user=admin
#配置密码
spring.activemq.password=admin
#true表示使用连接池,false表示不使用连接池;当为false时,每发送一条数据创建一个连接
spring.activemq.pool.enabled=true
#连接池最大连接数
spring.activemq.pool.max-connections=10
#空闲的连接过期时间,默认为30s
spring.activemq.pool.idle-timeout=30000
#强制的连接过期时间,与idleTimeout的区别在于:idleTimeout是在连接空闲一段时间失效,而expiryTimeout不管当前连接的情况,只要达到指定时间就失效。默认为0,never
spring.activemq.pool.expiry-timeout=0

第三步:编写相应代码

       1、我把生产者消费者都集成在了一个项目中,项目结构图如下所示:

       2、定义activemq的主题类型和名称,我们这里定义了主题模式(名称为activemq.topic)和队列模式(名称为activemq.queue)

import javax.jms.Queue;
import javax.jms.Topic;import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ActivemqConfig {// 定义队列模式@Beanpublic Queue queue1() {return new ActiveMQQueue("activemq.queue");}//定义主题模式@Beanpublic Topic topic() {return new ActiveMQTopic("activemq.topic");}}

       3、定义一个消息的提供者MessageProvider,使用一个定时任务来持续的发送数据,这里提供两种消息的发送方式,使用哪一种方式都可以,它们之间的差异性我们后续会分析,方式一(强烈不推荐):

@Configuration
public class MessageProvider1 {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Scheduled(fixedRate=5000,initialDelay=3000)public void send() {// 向队列发送消息jmsMessagingTemplate.convertAndSend("activemq.queue", Math.random());// 向主题发送消息jmsMessagingTemplate.convertAndSend("activemq.topic", Math.random());}
}

           下面是方式二,此时可以发现系统并没有指定queue的名称和topic的名称。

@Configuration
public class MessageProvider2 {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Queue queue;@Autowiredprivate Topic topic;@Scheduled(fixedRate=5000,initialDelay=3000)public void send() {// 向队列发送消息jmsMessagingTemplate.convertAndSend(queue, Math.random()); // 向主题发送消息jmsMessagingTemplate.convertAndSend(topic, Math.random());}
}

       4、定义一个消息的消费者MessageCustomer

@Component
public class MessageCustomer {@JmsListener(destination = "activemq.queue")public void q1(String text) {System.out.println("消费者consumer0消费的消息为:"+text);}@JmsListener(destination = "activemq.queue")public void q2(String text) {System.out.println("消费者consumer1消费的消息为:"+text);}@JmsListener(destination = "activemq.topic")public void t1(String text) {System.out.println("消费者consumer2消费的消息为:"+text);}@JmsListener(destination = "activemq.topic")public void t2(String text) {System.out.println("消费者consumer3消费的消息为:"+text);}
}

       5、定义启动类Application

@SpringBootApplication
@EnableScheduling
// 启动消息队列
@EnableJms
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

第四步:使用MessageProvider2进行测试

       1、我们首先采用MessageProvider2的方式进行测试,启动程序,输出结果如下所示,我们发现输出结果并不是我们想要的那种结果,如果是我们想要的结果输出结果还得打印消费者consumer2消费者consumer3消费的消息。

      2、结果分析:原来springboot默认采用的是p2p模式(队列)进行消息的监听。所以无法监听到topic模式的消息,那么如何对topic模式的消息进行监听呢?只需要在applicaiton.properties里面加上这样一个属性:

spring.jms.pub-sub-domain=true

       3、重启项目,输出结果如下图所示,此时topic模式的消息正常消费,但是队列模式的消息又无法正常消费,原因是springboot默认只支持一种类型消息的消费,那么如何支持两种呢?我们后面会说。

第五步:使用MessageProvider1进行测试

       1、我们首先注释掉刚才加在application.properties里面加的spring.jms.pub-sub-domain=true,启动项目,输出结果如下所示:

       2、我们发现输出结果并不是我们想要的,springboot默认支持队列模式的消息监听,但是当我门发送消息时,只是指定了消息接收方的名字,并没有指定消息接收方的类型,所以springboot默认将这两个消息提供者都看成了队列类型。所以才会出现现在的结果。

       3、在application.properties里面加上spring.jms.pub-sub-domain=true,重启项目,输出结果如下所示:

       4、我们发现只是将队列类型改成了主题类型,从根本上还是没有解决我们的问题,我们想让springboot既支持队列模式又支持主题模式。 

第六步:springboot同时支持topic和queue

       1、注释掉在application.properties里面加的spring.jms.pub-sub-domain=true

       2、在ActivemqConfig这个类里面重新定义两个bean

@Configuration
public class ActivemqConfig {// 定义队列模式@Beanpublic Queue queue() {return new ActiveMQQueue("activemq.queue");}//定义主题模式@Beanpublic Topic topic() {return new ActiveMQTopic("activemq.topic");}@Beanpublic JmsListenerContainerFactory topicListenerContainerFactory(ConnectionFactory connectionFactory){DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setPubSubDomain(true);factory.setConnectionFactory(connectionFactory);return factory;}@Beanpublic JmsListenerContainerFactory queueListenerContainerFactory(ConnectionFactory connectionFactory){DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setPubSubDomain(false);factory.setConnectionFactory(connectionFactory);return factory;}
}

       3、在MessageCustomer的方法注解JmsListener上添加属性containerFactory属性

@Component
public class MessageCustomer {@JmsListener(destination = "activemq.queue",containerFactory = "queueListenerContainerFactory")public void q1(String text) {System.out.println("消费者consumer0消费的消息为:"+text); }@JmsListener(destination = "activemq.queue",containerFactory = "queueListenerContainerFactory") public void q2(String text) {System.out.println("消费者consumer1消费的消息为:"+text); }@JmsListener(destination = "activemq.topic",containerFactory = "topicListenerContainerFactory")public void t1(String text) {System.out.println("消费者consumer2消费的消息为:"+text);}@JmsListener(destination = "activemq.topic",containerFactory = "topicListenerContainerFactory")public void t2(String text) {System.out.println("消费者consumer3消费的消息为:"+text);}
}

       4、重启项目,输出结果如下,我们发现现在的结果就是同时支持了queue模式和topic模式。

 

第七步:遇坑分析

        1、一直以为在activemq的管理界面中点击Queues里面显示的创建了多少个queue(队列)模式的主题,这个理解是错误的。其实这里面显示的信息是“MessageCustomer里面监听(destination)的(所有监听的主题和类型都会出现在这里,不论它是队列模式还是主题模式)+你自己创建的队列类型的主题”

       我们在destination中监听了activemq.queueactivemq.topic这两个,但我们创建了activemq.queue2队列activemq.topic2主题,并向它们分别发送了消息,注意:如果不向activemq.queue2activemq.topic2发送消息,仅仅是定义了一个bean,那么activemq就发现不了它们两个。此时的Queues的组成就是监听的activemq.queueactivemq.topic+创建的activemq.queue2。

       2、如果我们想看我们定义的topic,进入到Topics下查看即可。

 


推荐阅读
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
author-avatar
手机用户2502939965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有