ActiveMQ
JMS 仅支持 Java 平台
。
由于 JMS 是一套标准,所以 SpringBoot 整合 JMS 必然是整合 JMS 的某一个实现。
Apache ActiveMQ 是一个开源的消息中间件,完全支持 JMS 1.1 规范,支持多种编程语言( C、C++、C#、Delphi、Erlang、AdobeFlash、Haskell,Java、Javascript、Perl、PHP、Pike、Python、Ruby )和协议 (OpenWire、REST、STOMP、WS-Notification、MQTT、XMPP、AMQP ),且其提供了集群支持。
我们使用 JMS 一般是使用 spring-JMS 和 ActiveMQ 相结合,通过 SpringBoot 为我们配置好的
JmsTemplate 发送消息到指定目的地 Destination。
一、安装 ActiveMQ 并启动
注:
JDK 版本需要 1.7 及以上才行
。
1、windows 版本
1、到 Apache官方网站下载最新的 ActiveMQ 的安装包,下载链接如下:ActiveMQ
下载。
(1)选择 ActiveMQ 5
(2)选择 windows,进行下载
2、下载后解压到本地目录下,解压目录如下:
3、打开 bin 目录,启动 activemq.bat 如果机器是 64 位,则打开 win64 目录,双击 activemq.bat 进行启动。 (注意:不要直接打开 bin 目录下的 activemq.bat,要选择 win64 或 win32 目录下的 activemq.bat
)
4、activemq.bat 运行结果如下:
5、ActiveMQ 启动成功!成功之后在浏览器输入ActiveMQ的管理页面地址( 本机地址是 http://127.0.0.1:8161 ),可以看到 ActiveMQ 的管理页面,用户名和密码默认都是 admin
,如下:
6、ActiveMQ 的相关配置
1)
用户名密码配置
在 apache-activemq-5.14.5\conf\jetty-realm.properties 文件,格式是用户名:密码 ,角色名。2)
用户名权限配置信息
记录在 apache-activemq-5.14.5\conf\jetty.xml 文件
2、Linux 版本
1、保证 Java 环境:JDK1.7 及以上
2、下载 ActiveMQ
wget http://mirrors.hust.edu.cn/apache//activemq/5.15.12/apache-activemq-5.15.12-bin.tar.gz
3、解压下载的文件
tar -zxvf apache-activemq-5.15.12-bin.tar.gz
4、启动 ActiveMQ,命令如下
cd apache-activemq-5.15.12 cd bin/ # 切换目录到 activemq 的 bin 目录下 ./activemq start # 启动 activemq
5、输入服务器 http://ip:port 进行访问 ActiveMQ 管理页面,ActiveMQ 默认端口号是 8161。
二、SpringBoot 整合 ActiveMQ
1、添加依赖
两个 springboot 项目分别作为消息提供者(provider)和消费者(consumer)
提供者和消费者分别添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!--消息队列连接池-->
<!--springboot 2.0及以上-->
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
<version>1.0.4</version>
</dependency>
2、配置消息队列
(1)在两个项目中的 application.properires 配置消息队列
# failover:(tcp://localhost:61616,tcp://localhost:61617)
# tcp://localhost:61616
spring.activemq.broker-url=tcp://localhost:61616
#true 表示使用内置的MQ,false则连接服务器
# 用户密码
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.in-memory=false
#true表示使用连接池;false时,每发送一条数据创建一个连接
spring.activemq.pool.enabled=true
#连接池最大连接数
spring.activemq.pool.max-connections=10
#空闲的连接过期时间,默认为30秒
spring.activemq.pool.idle-timeout=30000
#强制的连接过期时间,与idleTimeout的区别在于:idleTimeout是在连接空闲一段时间失效,而expiryTimeout不管当前连接的情况,只要达到指定时间就失效。默认为0,never
spring.activemq.pool.expiry-timeout=0
#如果是点对点(queue),那么此处默认应该是false,如果发布订阅,那么一定设置为true
spring.jms.pub-sub-domain=true
(2)在提供者和消费者的启动类添加 @EnableJms 开启消息队列
// 1、提供者
@SpringBootApplication
@EnableJms //启动消息队列
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
// 2、消费者
@SpringBootApplication
@EnableJms //启动消息队列
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
@EnableJms 会启动 jms 的注解扫描即发现 @JmsListener 注释的方法创建消息监听容器,相当于 <jms:annotation-d riven/>
3、服务提供者 provider
(1)配置类定义消息队列
import javax.jms.Queue;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JMSBean {
//定义存放消息的队列
@Bean
public Queue queue() {
return new ActiveMQQueue("activeMQQueue");
}
}
(2)ProviderController 发送消息
import javax.jms.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProviderController {
//注入存放消息的队列,用于下列方法一
@Autowired
private Queue queue;
//注入springboot封装的工具类
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@RequestMapping("send")
public void send(String name) {
//方法一:添加消息到消息队列
jmsMessagingTemplate.convertAndSend(queue, name);
//方法二:这种方式不需要手动创建queue,系统会自行创建名为test的队列
//jmsMessagingTemplate.convertAndSend("test", name);
}
}
这里的 jmsMessagingTemplate 是用 @Autowired 注解自动注入的,在整个工程里都没有配置实例化的地方。
jmsMessagingTemplate 的实例化是 springboot 的 autoconfigure 自动注入的。
实现可以参见 JmsAutoConfiguration.java 的代码。当我们引入了 jms 相关的包,比如 activemq 的包,又定义了 ConnectionFactory 的实例,那么他就会自动生成一个 JmsTemplate 实例。
(3)在 ActiveMQ 管理页面中查看发送的消息
1)启动 provider,向消息队列添加数据
2)查看 ActiveMQ 管理页面
Number Of Pending Messages:消息队列中待处理的消息
Number Of Consumers:消费者的数量
Messages Enqueued:累计进入过消息队列的总量
Messages Dequeued:累计消费过的消息总量
4、服务消费者 consumer
(1)定义消费者的消息接收器:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;
@Component
public class ConsumerService {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
// 使用JmsListener配置消费者监听的队列
@JmsListener(destination = "activeMQQueue")
// SendTo 会将此方法返回的数据, 写入到 OutQueue 中去.
@SendTo("SQueue")
public String handleMessage(String name) {
System.out.println("成功接受:" + name);
return "成功接受:" + name;
}
}
(2)启动消费者