十二、消息服务(1)

本章概要

  • JMS
  • Spring Boot 整合 JMS(ActiveMQ)

消息队列(Message Queue)是一种进程间或者线程间到的异步通信方式,使用消息队列,消息生产者在产生消息后,会将消息保存在消息队列中,直到消息消费者来取走它,即消息的发送者和接收者不需要同时与消息队列交互。
使用消息队列可以有效实现服务的解耦,并提高系统的可靠性以及可扩展性。目前开源的消息队列服务非常多,如 Apache ActiveMQ,RabbitMQ 等,这些产品也就是常说的消息中间件。

12.1 JMS

12.1.1 JMS 简介

JMS(Java Message Service)即 Java消息服务,它通过统一 JAVA API 层面的标准,使得多个客户端可以通过 JMS 进行交互,大部分消息中间件提供商都对 JMS 提供支持。JMS 和 ActiveMQ 的关系就想 JDBC 和 JDBC 驱动的关系。
JMS 包括两种消息模型:点对点和发布者/订阅者,同时 JMS 仅支持 Java 平台。

12.1.2 Spring Boot 整合 JMS

由于 JMS 是一套标准,因此 Spring Boot 整合 JMS 必然就是整合 JMS 的某一个实现,此处以 ActiveMQ 为例来整合 Spring Boot。

1. ActiveMQ 简介

Apache ActiveMQ 是一个开源的消息中间件,不仅完全支持 JMS 1.1 规范,而且支持多种编程语言,例如C、C++、C#、Delphi、Erlang、Adobe Flash、Haskell、Java、JavaScript、Perl、PHP、Pike、Python和Ruby等,也支持多种协议,例如 OpenWire 、REST、STOMP、WS-Notification、MQTT、XMPP 以及 AMQP 。Apache ActiveMQ 也提供了对 Spring 框架的支持,可以非常容易地嵌入 Spring 中,同时它也提供了集群支持。

2. ActiveMQ 安装

一般情况下 ActiveMQ 都是安装在 Linux 上的,此处的安装环境为 Centos 7,ActiveMQ 版本为 5.15.4。(注意:需要提前安装 Java 运行环境,参考:https://blog.csdn.net/GXL_1012/article/details/112375515
步骤01:下载 ActiveMQ

wget http://mirrors.hust.edu.cn/apache//activemq/5.15.4/apache-activemq-5.15.4-bin.tar.gz

连接超时,试一下这个

wget https://archive.apache.org/dist/activemq/5.15.4/apache-activemq-5.15.4-bin.tar.gz

如果还是不行,来这下载:https://download.csdn.net/download/GXL_1012/86399123
步骤02:解压下载文件

tar -zxvf /opt/package/apache-activemq-5.15.4-bin.tar.gz -C /opt/soft/

步骤03:启动 ActiveMQ

/opt/soft/apache-activemq-5.15.4/bin/activemq start

步骤04:访问
http://ip:8161/,注意关闭防火墙
在这里插入图片描述

单击 Manage ActiveMQ broker 超链接进入管理员控制台,默认用户名和密码都是admin
在这里插入图片描述

3.整合 Spring Boot

创建 Spring Boot 项目,添加 ActiveMQ 依赖

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

然后在 application.properties 中进行配置

spring.activemq.broker-url=tcp://ip:61616
spring.activemq.packages.trust-all=true
spring.activemq.user=admin
spring.activemq.password=admin

首先配置 broker 地址,默认端口是 61616 ,然后配置新人所有包,这个配置是为了支持发送对象消息,最后配置 ActiveMQ 的用户名密码。
然后在项目配置类中提供一个消息队列 Bean ,该 Bean 的实例就由 ActiveMQ 提供

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    @Bean
    Queue queue() {
        return new ActiveMQQueue("amq");
    }
}

接下来创建一个 JMS 组件来完成消息的发送和接收

@Component
public class JmsComponent {
    @Autowired
    JmsMessagingTemplate messagingTemplate;
    @Autowired
    Queue queue;
    public void send(Message msg) {
        messagingTemplate.convertAndSend(this.queue, msg);
    }
    @JmsListener(destination = "amq")
    public void receive(Message msg) {
        System.out.println("receive:" + msg);
    }
}

JmsMessagingTemplate 是由 Spring 提供的一个 JMS 消息发送模版,可以用来方便地进行消息的发送,消息发送方法 convertAndSend 的第一个参数是消息队列,第二个参数是消息内容,此处演示一个对象消息。
@JmsListener 注解则表示相应的方法是一个消息消费者,消息消费者订阅的消息 destination 为 amq。

相关实体类 Message

public class Message implements Serializable {
    private String content;
    private Date date;

    @Override
    public String toString() {
        return "Message{" +
                "content='" + content + '\'' +
                ", date=" + date +
                '}';
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

4. 测试

编写测试类,完成消息发送测试,如下

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
    @Autowired
    JmsComponent jmsComponent;
    @Test
    public void contextLoads() {
        Message msg = new Message();
        msg.setContent("hello jms!");
        msg.setDate(new Date());
        jmsComponent.send(msg);
    }
}

在测试类中注入 JmsComponent 组件,然后调用该组件的 send 方法发送一个 Message 对象。
确认 ActiveMQ 已经启动,然后启动 Spring Boot,Spring Boot 项目启动成功后,执行该单元测试方法,观察 Spring Boot 日志,如下:

receive:Message{content='hello jms!', date=Fri Aug 12 14:47:01 CST 2022}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小熊猫呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值