本章概要
- 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}