我的编程空间,编程开发者的网络收藏夹
学习永远不晚

spring boot中如何操作ActiveMQ

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

spring boot中如何操作ActiveMQ

本篇文章为大家展示了spring boot中如何操作ActiveMQ,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

前言

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。

目前在生产环境中使用较多的消息队列有 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ 等。

特性

  • 异步性:将耗时的同步操作通过以发送消息的方式进行了异步化处理,减少了同步等待的时间。

  • 松耦合:消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节,只要定义好消息的格式就行。

  • 分布式:通过对消费者的横向扩展,降低了消息队列阻塞的风险,以及单个消费者产生单点故障的可能性(当然消息队列本身也可以做成分布式集群)。

  • 可靠性:消息队列一般会把接收到的消息存储到本地硬盘上(当消息被处理完之后,存储信息根据不同的消息队列实现,有可能将其删除),这样即使应用挂掉或者消息队列本身挂掉,消息也能够重新加载。

JMS 规范

JMS 即 Java 消息服务(Java Message Service)应用程序接口,是一个 Java 平台中关于面向消息中间件(MOM)的 API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java 消息服务是一个与具体平台无关的 API,绝大多数 MOM 提供商都对 JMS 提供支持。

JMS 的消息机制有 2 种模型,一种是 Point to Point,表现为队列的形式,发送的消息,只能被一个接收者取走;另一种是 Topic,可以被多个订阅者订阅,类似于群发。

ActiveMQ 是 JMS 的一个实现。

ActiveMQ 介绍

ActiveMQ 是 Apache 软件基金下的一个开源软件,它遵循 JMS1.1 规范(Java Message Service),是消息驱动中间件软件(MOM)。它为企业消息传递提供高可用、出色性能、可扩展、稳定和安全保障。ActiveMQ 使用 Apache 许可协议,因此,任何人都可以使用和修改它而不必反馈任何改变。

ActiveMQ 的目标是在尽可能多的平台和语言上提供一个标准的,消息驱动的应用集成。ActiveMQ 实现 JMS 规范并在此之上提供大量额外的特性。ActiveMQ 支持队列和订阅两种模式的消息发送。

Spring Boot 提供了 ActiveMQ 组件 spring-boot-starter-activemq,用来支持 ActiveMQ 在 Spring Boot 体系内使用,下面我们来详细了解如何使用。

添加依赖

主要添加组件:spring-boot-starter-activemq。

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-activemq</artifactId></dependency>

配置文件

在 application.properties 中添加配置。

# 基于内存的 ActiveMQspring.activemq.in-memory=true# 不适应连接池spring.activemq.pool.enabled=false # 独立安装的 ActiveMQ#spring.activemq.broker-url=tcp://192.168.0.1:61616#spring.activemq.user=admin#spring.activemq.password=admin

在使用 ActiveMQ 时有两种使用方式,一种是使用独立安装的 ActiveMQ,在生产环境推荐使用这种;另一种是使用基于内存 ActiveMQ ,在调试阶段建议使用这种方式。

队列(Queue)

队列发送的消息,只能被一个消费者接收。

创建队列

@Configurationpublic class MqConfig {    @Bean    public Queue queue() {        return new ActiveMQQueue("neo.queue");    }}

使用 @Configuration 注解在项目启动时,定义了一个队列 queue 命名为:neo.queue。

消息生产者

创建一个消息的生产者:

@Componentpublic class Producer{    @Autowired    private JmsMessagingTemplate jmsMessagingTemplate;    @Autowired    private Queue queue;    public void sendQueue(String msg) {        System.out.println("send queue msg :"+msg);        this.jmsMessagingTemplate.convertAndSend(this.queue, msg);    }}

JmsMessagingTemplate 是 Spring 提供发送消息的工具类,使用 JmsMessagingTemplate 和创建好的 queue 对消息进行发送。

消息消费者

@Componentpublic class Consumer {     @JmsListener(destination = "neo.queue")    public void receiveQueue(String text) {        System.out.println("Consumer queue msg : "+text);    }}

使用注解 @JmsListener(destination = "neo.queue"),表示此方法监控了名为 neo.queue 的队列。当队列 neo.queue 中有消息发送时会触发此方法的执行,text 为消息内容。

测试

创建 SampleActiveMqTests 测试类,注入创建好的消息生产者。

@RunWith(SpringRunner.class)@SpringBootTestpublic class SampleActiveMqTests {    @Autowired    private Producer producer;    @Rule    public OutputCapture outputCapture = new OutputCapture();}

OutputCapture 是 Spring Boot 提供的一个测试类,它能捕获 System.out 和 System.err 的输出,我们可以利用这个特性来判断程序中的输出是否执行。

@Testpublic void sendSimpleQueueMessage() throws InterruptedException {    this.producer.sendQueue("Test queue message");    Thread.sleep(1000L);    assertThat(this.outputCapture.toString().contains("Test queue")).isTrue();}

创建测试方式,使用 producer 发送消息,为了保证容器可以接收到消息,让测试方法等待 1 秒,最后使用 outputCapture 判断是否执行成功。

测试多消费者

上面的案例只是一个生产者一个消费者,我们在模拟一个生产者和多个消费者队列的执行情况。我们复制上面的消费者 Consumer 重新命名为 Consumer2,并且将输出内容加上 2 的关键字,如下:

@Componentpublic class Consumer2 {    @JmsListener(destination = "neo.queue")    public void receiveQueue(String text) {        System.out.println("Consumer2 queue msg : "+text);    }}

在刚才的测试类中添加一个 send100QueueMessage() 方法,模式发送 100 条消息时,两个消费者是如何消费消息的。

@Testpublic void send100QueueMessage() throws InterruptedException {    for (int i=0;i<100;i++){        this.producer.sendQueue("Test queue message"+i);    }    Thread.sleep(1000L);}

控制台输出结果:

Consumer queue msg : Test queue message0

Consumer2 queue msg : Test queue message1

Consumer queue msg : Test queue message2

Consumer2 queue msg : Test queue message3

...

根据控制台输出的消息可以看出,当有多个消费者监听一个队列时,消费者会自动均衡负载的接收消息,并且每个消息只能有一个消费者所接收。

注意:控制台输出 javax.jms.JMSException: peer (vm://localhost#1) stopped. 报错信息可以忽略,这是 Info 级别的错误,是 ActiveMQ 的一个 bug。

广播(Topic)

广播发送的消息,可以被多个消费者接收。

创建 Topic

@Configurationpublic class MqConfig {    @Bean    public Topic topic() {        return new ActiveMQTopic("neo.topic");    }}

使用 @Configuration 注解在项目启动时,定义了一个广播 Topic 命名为:neo.topic。

消息生产者

创建一个消息的生产者:

@Componentpublic class Producer{    @Autowired    private JmsMessagingTemplate jmsMessagingTemplate;    @Autowired    private Topic topic;    public void sendTopic(String msg) {        System.out.println("send topic msg :"+msg);        this.jmsMessagingTemplate.convertAndSend(this.topic, msg);    }}

和上面的生产者对比只是 convertAndSend() 方法传入的第一个参数变成了 Topic。

消息消费者

@Componentpublic class Consumer {     @JmsListener(destination = "neo.topic")    public void receiveTopic(String text) {        System.out.println("Consumer topic msg : "+text);    }}

消费者也没有变化,只是监听的名改为上面的 neo.topic,因为模拟多个消费者,复制一份 Consumer 命名为 Consumer2,代码相同在输出中标明来自 Consumer2。

测试

创建 SampleActiveMqTests 测试类,注入创建好的消息生产者。

@Testpublic void sendSimpleTopicMessage() throws InterruptedException {    this.producer.sendTopic("Test Topic message");    Thread.sleep(1000L);}

测试方法执行成功后,会看到控制台输出信息,如下:

send topic msg :Test Topic message

Consumer topic msg : Test Topic message

Consumer2 topic msg : Test Topic message

可以看出两个消费者都收到了发送的消息,从而验证广播(Topic)是一个发送者多个消费者的模式。

同时支持队列(Queue)和广播(Topic)

Spring Boot 集成 ActiveMQ 的项目默认只支持队列或者广播中的一种,通过配置项 spring.jms.pub-sub-domain 的值来控制,true 为广播模式,false 为队列模式,默认情况下支持队列模式。

如果需要在同一项目中既支持队列模式也支持广播模式,可以通过 DefaultJmsListenerContainerFactory 创建自定义的 JmsListenerContainerFactory 实例,之后在 @JmsListener 注解中通过 containerFactory 属性引用它。

分别创建两个自定义的 JmsListenerContainerFactory 实例,通过 pubSubDomain 来控制是支持队列模式还是广播模式。

@Configuration@EnableJmspublic class ActiveMQConfig {     @Bean("queueListenerFactory")    public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory) {        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();        factory.setConnectionFactory(connectionFactory);        factory.setPubSubDomain(false);        return factory;    }     @Bean("topicListenerFactory")    public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory) {        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();        factory.setConnectionFactory(connectionFactory);        factory.setPubSubDomain(true);        return factory;    }}

然后在消费者接收的方法中,指明使用 containerFactory 接收消息。

@Componentpublic class Consumer {     @JmsListener(destination = "neo.queue", containerFactory = "queueListenerFactory")    public void receiveQueue(String text) {        System.out.println("Consumer queue msg : "+text);    }     @JmsListener(destination = "neo.topic", containerFactory = "topicListenerFactory")    public void receiveTopic(String text) {        System.out.println("Consumer topic msg : "+text);    }}

改造完成之后,再次执行队列和广播的测试方法,就会发现项目同时支持了两种类型的消息收发。

消息中间件广泛应用在大型互联网架构中,利用消息中间件队列和广播各自的特性可以支持很多业务,比如群发发送短信、给单个用户发送邮件等。ActiveMQ 是一款非常流行的消息中间件,它的特点是部署简单、使用方便,比较适合中小型团队。Spring Boot 提供了集成 ActiveMQ 对应的组件,在 Spring Boot 中使用 ActiveMQ 只需要添加相关注解即可。

上述内容就是spring boot中如何操作ActiveMQ,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

spring boot中如何操作ActiveMQ

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

spring boot中如何操作ActiveMQ

本篇文章为大家展示了spring boot中如何操作ActiveMQ,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问
2023-06-21

Spring boot如何操作文件

小编给大家分享一下Spring boot如何操作文件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、获取文件路径获取文件路径1、class.getResource(path)其中的参数path有两种形式,一种是以“/”开
2023-06-25

Spring Boot集成Redis实战操作

最近在使用Spring Boot,发现其功能真是强大,可以快速的集成很多的组件功能,非常方便:今天就来介绍下,如何集成Redis。定义Redis 是一个高性能的key-value数据库。它支持存储的value类型很多,包括string(字符
2023-06-02

如何实现Spring Boot接口参数的加密解密操作

这篇文章主要介绍如何实现Spring Boot接口参数的加密解密操作,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!加密解密本身并不是难事,问题是在何时去处理?定义一个过滤器,将请求和响应分别拦截下来进行处理也是一个办
2023-06-14

Spring Boot中如何使用Starter

本篇内容主要讲解“Spring Boot中如何使用Starter”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Boot中如何使用Starter”吧!SpringBoot简介Spri
2023-06-16

java中Spring boot如何使用

这篇文章主要介绍“java中Spring boot如何使用”,在日常操作中,相信很多人在java中Spring boot如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java中Spring boot如
2023-06-16

spring-boot中spring-boot-maven-plugin报红错误如何解决

这篇文章主要介绍了spring-boot中spring-boot-maven-plugin报红错误如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇spring-boot中spring-boot-maven
2023-07-05

Spring Boot中怎么利用Redis 实现缓存操作

这期内容当中小编将会给大家带来有关Spring Boot中怎么利用Redis 实现缓存操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存的应用场景二、更新缓存的策略三、运行 springboot-
2023-06-17

Spring Boot中使用jdbctemplate 操作MYSQL数据库实例

最近在学习使用Spring Boot连接数据库,今天学习了使用jdbctemplate 操作MYSQL数据库,下面就留个笔记不废话,先来代码pom文件:2023-05-31

Spring Boot如何排除某个类加载注入IOC的操作

小编给大家分享一下Spring Boot如何排除某个类加载注入IOC的操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring Boot 排除某个类加载注入
2023-06-20

利用Spring Boot操作MongoDB的方法教程

MongoDBMongoDB作为一种NoSQL数据库产品,其实已经非常著名了。去年,由于MongoDB安全认证的薄弱,上万家公司中招。虽然是一则负面新闻,但是也从侧面说明了MongoDB的流行程度。下图是DB-Engines统计的2017年
2023-05-31

使用spring-boot如何实现整合dubbo中的Spring-boot-dubbo-starter

使用spring-boot如何实现整合dubbo中的Spring-boot-dubbo-starter?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在application.p
2023-05-31

Lombok如何在Spring Boot中使用

本篇文章给大家分享的是有关Lombok如何在Spring Boot中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。springboot是什么springboot一种全新的编
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录