系列文章
ActiveMq系列(三):Springboot集成ActiveMq
目录
前言
activemq官方并未给出相关的集成文档,spring官方有提供一些简单的集成方案,想自己搞一搞的可以去看第一手资料,这里也只是对个人整合的一次总结。本文源码
maven依赖
集成主要依赖:
<!-- activemq的springboot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
<!-- JmsPoolConnectionFactory 连接池依赖包(非必要) -->
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
<version>1.1.1</version>
</dependency>
整个pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.activemq</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- activemq的springboot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
<!-- PooledConnectionFactory连接池依赖包(JMS) 被摒弃 -->
<!-- <dependency>-->
<!-- <groupId>org.apache.activemq</groupId>-->
<!-- <artifactId>activemq-pool</artifactId>-->
<!-- <version>5.15.13</version>-->
<!-- </dependency>-->
<!-- JmsPoolConnectionFactory 连接池依赖包(jms) 新的连接池依赖-->
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
<version>1.1.1</version>
</dependency>
<!-- 便捷生成getter 和 setter -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意:如果 spring.activemq.pool.enable=true 启用了连接池
连接池这里的activemq连接池要根据 spring-boot-starter-activemq 版本来
2.1.x以上的版本用 pooled-jms
2.1.x以下的版本用 activemq-pool
具体请看上面pom
配置文件
server:
port: 10000
spring:
activemq:
#代理地址
broker-url: tcp://10.0.80.211:61616
#账号
user: zhangsan
#密码
password: 12345
#false 内存模式启动代理 true 远程访问代理
in-memory: false
#jms连接池
pool:
enabled: true
max-connections: 50
#包配置
packages:
#是否全部受信任
trust-all: true
#单独配置受信任的包
trusted: com.activemq.demo
- 简要说明
基础篇集成代码
- 启动添加JmsListener发现,@EnableJms 注解
@SpringBootApplication
@EnableJms
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 配置消息监听容器,该容器默认帮我们处理session、connection等创建、释放等操作,帮助我们回收资源
这里配置两个消息监听容器,一个为 queue 的 queueContainerFactory ,一个为 topic 的 topicContainerFactory
@Configuration
public class MQContainerFactory {
/**
* 配置queue消息监听容器
* @param connectionFactory
* @return
*/
@Bean
public JmsListenerContainerFactory queueContainerFactory(@Qualifier("jmsConnectionFactory") ConnectionFactory connectionFactory)
{
//默认容器,符合大多数需求
DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
//添加连接工厂
jmsListenerContainerFactory.setConnectionFactory(connectionFactory);
return jmsListenerContainerFactory;
}
/**
* 配置topic消息监听容器
* @param connectionFactory
* @return
*/
@Bean
public JmsListenerContainerFactory topicContainerFactory(@Qualifier("jmsConnectionFactory") ConnectionFactory connectionFactory)
{
//默认容器,符合大多数需求
DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
//添加连接工厂
jmsListenerContainerFactory.setConnectionFactory(connectionFactory);
//设置为topic
jmsListenerContainerFactory.setPubSubDomain(true);
return jmsListenerContainerFactory;
}
}
- 添加消息监听者配置,这里不同的消息监听类型指定不同的监听容器
/**
* 消费者配置
*/
@Component
public class MQConsumer {
/**
* 字符串队列消费者
* @param message
*/
@JmsListener(destination = "activemq.queue.string",containerFactory = "queueContainerFactory")
public void consumeStringMsg(String message)
{
System.out.println("收到消息String:"+message);
}
/**
* 字符串topic消费者
* @param message
*/
@JmsListener(destination = "activemq.topic.string",containerFactory = "topicContainerFactory")
public void consumeStringTopic(String message)
{
System.out.println("收到消息topic:"+message);
}
}
- 添加controller用来发送消息,这里上面pom已经导入了依赖包,没得得朋友添加pom: spring-boot-starter-web
@RestController
@RequestMapping("/activemq/msg")
public class MQController {
/**
* 通过queue发送字符串
* @param queue
* @param msg
*/
@PostMapping("/queue/string")
public void sendQueueStringMsg( String queue,String msg)
{
}
/**
* 通过topic广播字符串
* @param topic
* @param msg
*/
@PostMapping("/topic/string")
public void sendTopicStringMsg(String topic, String msg)
{
}
}
- 添加 JmsTemplate 用来帮助我们发送消息,这个类不仅是 MessageProducer 的封装,还可以接收消息以及设置自定义消息解析( MessageConverter )
@RestController
@RequestMapping("/activemq/msg")
public class MQController {
@Autowired
JmsTemplate jmsTemplate;
/**
* 通过queue发送字符串
* @param queue
* @param msg
*/
@PostMapping("/queue/string")
public void sendQueueStringMsg( String queue,String msg)
{
//默认是queue队列消息,可以不封装
jmsTemplate.convertAndSend(queue,msg);
}
/**
* 通过topic广播字符串
* @param topic
* @param msg
*/
@PostMapping("/topic/string")
public void sendTopicStringMsg(String topic, String msg)
{
//封装成topic消息
ActiveMQTopic activeMQTopic = new ActiveMQTopic(topic);
jmsTemplate.convertAndSend(activeMQTopic,msg);
}
}
- 简单的启动服务测试一下
对象篇集成代码
对比上面的配置,这里只是添加相关配置以及说明
- 简单的生成一个对象,这里借助 lombok 插件
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Data
public class EntityMessage implements Serializable {
private String msg;
private String code;
}
注意:这里要序列化
- 添加一个新的对象消息监听到 MQConsumer 配置
/**
* entity队列消费者
* @param message
*/
@JmsListener(destination = "activemq.queue.entity",containerFactory = "queueContainerFactory")
public void consumeEntityMsg(EntityMessage message)
{
System.out.println("收到消息entity:"+message.toString());
}
- 添加一个新的接口用来接收发送消息参数
/**
* 通过queue发送对象
* @param queue
* @param msg
*/
@PostMapping("/queue/entity")
public void sendQueueEntityMsg(String queue, EntityMessage msg)
{
//默认是queue队列消息,可以不封装
jmsTemplate.convertAndSend(queue,msg);
}
- 这就完了?No,No,No,重要的事情说三遍,有记忆的同学看 最上面 👆 ,这里不添加至关重要的配置,编译没问题,运行出错,下面添加至关重要的配置(有记忆的同学请忽略):
#包配置
packages:
#是否全部受信任
trust-all: true
#单独配置受信任的包
trusted: com.activemq.demo
- 这下我们配置好,测试一下
尾声
其实activemq的功能还是很强大的,其支持的消息类型从文本、数组、json、对象到流数据等等,这里只是简单搞一搞,因为是在两个服务器上交替完成测试和应用的,错误之处请大家纠正。