JMS 简介
JMS( Java Message Service )
即 Java 消息服务,它通过统一 JAVA API 层面的标准,使得多个客户端可以通过 JMS 进行交互,大部分消息中间件提供商都对 JMS 提供支持。 JMS 和 ActiveMQ 的关系就象 JDBC 和 JDBC 驱动的关系。 JMS 包括两种消息模型:点对点和发布者/订阅者,同时 JMS 仅支持 Java 平台。
由于 JMS 是一套标准,因此 Spring Boot 整合 JMS 必然就是整合 JMS 的某一个实现,现以 ActiveMQ 为例进行整合。
ActiveMQ 简介
Apache ActiveMQ
是一个开源的消息中间件,它不仅完全支持 JMS1.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 中,同时它也提供了集群支持。
Spring Boot 整合 JMS
步骤如下:
- 添加依赖
<!-- ActiveMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
- 在
application.properties
中进行连接配置
# ActiveMQ
spring.activemq.broker-url=tcp://192.168.237.128:61616
# 配置信任所有的包,这个配置是为了支持发送对象消息
spring.activemq.packages.trust-all=true
spring.activemq.user=admin
spring.activemq.password=admin
- 在项目配置类中提供一个消息队列
Bean
,该Bean
的实例就由ActiveMQ
提供
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import javax.jms.Queue;
@SpringBootApplication
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
@Bean
Queue queue() {
return new ActiveMQQueue("amq");
}
}
- 创建消息实体
import java.io.Serializable;
import java.util.Date;
public class Message implements Serializable {
private String content;
private 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;
}
@Override
public String toString() {
return "Message{" +
"content='" + content + '\'' +
", date=" + date +
'}';
}
}
- 创建一个
JMS
组件来完成消息的发送和接收
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;
import xyz.ther.boot.pojo.Message;
import javax.jms.Queue;
@Component
public class JmsComponent {
@Autowired
JmsMessagingTemplate messagingTemplate;
@Autowired
Queue queue;
public void send(Message message) {
messagingTemplate.convertAndSend(this.queue, message);
}
@JmsListener(destination = "amq")
public void receive(Message message) {
System.out.println("receive:" + message);
}
}
JmsMessagingTemplate
是由 Spring
提供的一个 JMS
消息发送模板,可以用来方便地进行消息的发送, 消息发送方法 convertAndSend
的第一个参数是消息队列, 第二个参数是消息内容,例中演示一个对象消息。@JmsListener
注解则表示相应的方法是一个消息消费者,消息消费者订阅的消息 destination
为 amq
。
- 消息发送测试
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import xyz.ther.boot.jms.JmsComponent;
import xyz.ther.boot.pojo.Message;
import xyz.ther.boot.service.UserService;
import java.util.Date;
@RunWith(SpringRunner.class)
@SpringBootTest
class BootApplicationTests {
@Autowired
JmsComponent jmsComponent;
@Test
void contextLoads() {
Message message = new Message();
message.setContent("Hello JMS!");
message.setDate(new Date());
jmsComponent.send(message);
}
}
测试输出:
receive:Message{content='Hello JMS!', date=Fri Feb 14 18:08:43 CST 2020}