ActiveMQ集成
一、ActiveMQ集成Spring
1. 创建项目
2. 配置POM
<properties>
<activemq.version>5.15.5</activemq.version>
<slf4j.version>1.7.25</slf4j.version>
<lombok.version>1.16.20</lombok.version>
<spring.version>4.3.29.RELEASE</spring.version>
</properties>
<dependencies>
<!-- ActiveMQ配置-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>${activemq.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>${activemq.version}</version>
</dependency>
<!-- jms-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- slf4j通用配置-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- lombok配置-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
3. 队列模式(Queue)
3.1 创建application-queue.xml
3.2 配置连接工厂
<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://**.**.**.**:61616"/>
</bean>
</property>
<!-- 最大连接数 -->
<property name="maxConnections" value="100"/>
</bean>
3.3 配置目的地
<bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
<!-- 使用构造方法的参数注入队列名称 -->
<constructor-arg index="0" value="MQ-Queue"/>
</bean>
3.4 配置操作MQ对象的jmsTemplate
<bean id="JmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 注入工厂-->
<property name="connectionFactory" ref="jmsFactory" />
<!-- 注入消息发送的默认目的地-->
<property name="defaultDestination" ref="destinationQueue" />
<!-- 消息转换器-->
<property name="messageConverter">
<bean lass="org.springframework.jms.support.converter.SimpleMessageConverter" />
</property>
</bean>
3.5 生产者
public class QueueProducer {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-queue.xml");
JmsTemplate jmsTemplate= context.getBean(JmsTemplate.class);
// 发消息(发送到默认的目的地)
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
// 创建消息
TextMessage message = session.createTextMessage("MQ-Spring-Queue");
message.setStringProperty("String","StringProperty");
return message;
}
});
System.out.println("发送成功!");
}
}
3.6 消费者
public class QueueConsumer {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-queue.xml");
JmsTemplate jmsTemplate= context.getBean(JmsTemplate.class);
try {
// 如果不设置目的地,迷人监听的是默认的目的地 -jmsTemplate.receive(destination)->监听指定目的地
TextMessage message = (TextMessage) jmsTemplate.receive();
System.out.println("接收消息: "+message.getText()+" "+message.getStringProperty("String"));
} catch (JMSException e) {
e.printStackTrace();
}
/* 消息转换器接收
Object o = jmsTemplate.receiveAndConvert();
System.out.println(o);
*/
}
}
4.主题/订阅模式(Topic)
4.1 修改目的地配置
<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
<!-- 使用构造方法的参数注入队列名称 -->
<constructor-arg index="0" value="MQ-Topic"/>
</bean>
4.2 修改操作jmsTemplate对象配置
<bean id="JmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 注入工厂-->
<property name="connectionFactory" ref="jmsFactory" />
<!-- 注入消息发送的默认目的地-->
<property name="defaultDestination" ref="destinationTopic" />
<!-- 消息转换器-->
<property name="messageConverter">
<bean lass="org.springframework.jms.support.converter.SimpleMessageConverter" />
</property>
</bean>
5.监听器模式
5.1 创建Listener并集成MessageListener接口
// 监听器相当于消费者
public class ListenerHandler implements MessageListener {
public void onMessage(Message message) {
if (message instanceof TextMessage){
try {
System.out.println("监听器收到:"+((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
5.2 配置监听器对象
<bean id="listener" class="com.csl.listener.ListenerHandler" />
5.3 配置监听器容器
<bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsFactory" />
<property name="destination" ref="destinationQueue" />
<property name="messageListener" ref="listener" />
</bean>
二、ActiveMQ集成SpringBoot
1. 创建项目
重点:
- 在主程序上添加@EnableJms注解,即ActivemqSpringApplication
- 添加@EnableScheduling注解,即开启延时
2. 配置POM
<dependencies>
<!-- mq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!-- devtools-热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- configuration -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- test-->
<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>
</dependencies>
3. 队列模式(Queue)
3.1 配置application.yaml
spring:
activemq:
broker-url: tcp://**.**.**.**:61616
user: admin
password: admin
pool:
max-connections: 100
jms:
pub-sub-domain: false #false代表队列,true代表主题
#声明队列的名称
queue: activemq-boot-queue #@Value()
3.2 配置队列
@Component
public class QueueConfig {
@Value("${queue}")
private String queue;
@Bean
public Queue queue(){
return new ActiveMQQueue(queue);
}
}
3.3 生产者
@Component
public class QueueProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Queue queue;
@SuppressWarnings("deprecation")
public void produceMsg(){
jmsMessagingTemplate.convertAndSend(queue,"Queue-message==="+new Date().toString());
}
Integer i;
/**
* 延时发送
*/
@SuppressWarnings("deprecation")
@Scheduled(fixedDelay = 5000)
public void producerMsgScheduled(){
jmsMessagingTemplate.convertAndSend(queue,"****Queue-Scheduled***"+i++);
}
}
3.4 消费者
@Service
public class QueueConsumer {
@JmsListener(destination = "${queue}")
public void receive(TextMessage message) throws JMSException {
System.out.println("接收消息:"+message.getText());
}
}
监听到的延时发送的消息结果为:
4. 主题模式(Topic)
4.1修改application.yaml
jms:
pub-sub-domain: true #false代表队列,true代表主题
#声明主题的名称
topic: activemq-boot-topic #@Value()
4.2 配置主题
@Component
public class TopicConfig {
@Value("${topic}")
private String topic;
@Bean
public Topic topic(){
return new ActiveMQTopic(topic);
}
}
4.3 生产者
@Component
public class TopicProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Topic topic;
@SuppressWarnings("deprecation")
public void produceMsg(){
// 设置主题发送方式
jmsMessagingTemplate.getJmsTemplate().setPubSubDomain(true);
jmsMessagingTemplate.convertAndSend(topic,"Topic-message==="+new Date().toString());
}
Integer i=0;
/**
* 延时发送
*/
@SuppressWarnings("deprecation")
@Scheduled(fixedDelay = 5000)
public void producerMsgScheduled(){
jmsMessagingTemplate.getJmsTemplate().setPubSubDomain(true);
jmsMessagingTemplate.convertAndSend(topic,"****Topic-Scheduled***"+i++);
}
}
4.4 消费者
@Service
public class TopicConsumer {
@JmsListener(destination = "${topic}")
public void receive(TextMessage message) throws JMSException {
System.out.println("接收消息:"+message.getText());
}
}
监听到的延时发送的消息结果为:
三、分布式集成(Web充当发送者及同时监听多个队列和主题)
1. 创建项目
2. 添加依赖
<properties>
<activemq.version>2.3.5.RELEASE</activemq.version>
<java.version>1.8</java.version>
<lombok.version>1.18.16</lombok.version>
</properties>
<dependencies>
<!-- mq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
<version>${activemq.version}</version>
</dependency>
<!-- devtools-热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${activemq.version}</version>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- configuration -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${activemq.version}</version>
<optional>true</optional>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<!-- test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${activemq.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
3. 创建子项目-生产者(ActiveMQ-Producer)
重点:在主程序添加@EnableJms注解
3.1 导入父项目的依赖并添加Web模块的依赖
<parent>
<artifactId>ActiveMQ-Parent</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
</dependencies>
3.2 配置application.yaml
spring:
activemq:
broker-url: tcp://**.**.**.**:61616
user: admin
password: admin
pool:
max-connections: 100
jms:
pub-sub-domain: false
3.3 Controller发送消息队列和主题
@RestController
@RequestMapping("/send")
public class ProducerController {
@Autowired
private JmsTemplate jmsTemplate;
/**
* 发送队列1
* @return 返回成功信息
*/
@RequestMapping("/sendQueue1")
public Map<String,Object> sendQueue1(){
Map<String,Object> map = new HashMap<String, Object>(12);
jmsTemplate.setDefaultDestination(new ActiveMQQueue("queue-1"));
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage("queue1-producer-msg");
return message;
}
});
map.put("success","发送成功!");
return map;
}
/**
* 发送队列2
* @return 返回成功信息
*/
@RequestMapping("/sendQueue2")
public Map<String,Object> sendQueue2(){
Map<String,Object> map = new HashMap<String, Object>(12);
jmsTemplate.setDefaultDestination(new ActiveMQQueue("queue-2"));
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage("queue2-producer-msg");
return message;
}
});
map.put("success","发送成功!");
return map;
}
/**
* 发送主题1
* @return 返回成功信息
*/
@RequestMapping("/sendTopic1")
public Map<String,Object> sendTopic1(){
Map<String,Object> map = new HashMap<String, Object>(12);
jmsTemplate.setDefaultDestination(new ActiveMQTopic("topic-1"));
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage("topic1-producer-msg");
return message;
}
});
map.put("success","发送成功!");
return map;
}
/**
* 发送主题2
* @return 返回成功信息
*/
@RequestMapping("/sendTopic2")
public Map<String,Object> sendTopic2(){
Map<String,Object> map = new HashMap<String, Object>(12);
jmsTemplate.setDefaultDestination(new ActiveMQTopic("topic-2"));
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage("topic2-producer-msg");
return message;
}
});
map.put("success","发送成功!");
return map;
}
}
4. 创建子项目-消费者(ActiveMQ-Consumer)
重点:在主程序添加@EnableJms注解
4.1 导入父项目的依赖
<parent>
<artifactId>ActiveMQ-Parent</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
4.2 配置application.yaml
spring:
activemq:
broker-url: tcp://**.**.**.**:61616
user: admin
password: admin
pool:
max-connections: 100
jms:
pub-sub-domain: false
4.3 配置主题创建工厂(队列默认为false,可以不用配置)
@Configuration
public class JmsContainerFactoryConfig {
@Bean("jmsTopicContainerFactory")
public DefaultJmsListenerContainerFactory listenerTopicContainer(@Qualifier("jmsConnectionFactory") ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory container = new DefaultJmsListenerContainerFactory();
container.setConnectionFactory(connectionFactory);
// 设置对主题的监听(false为队列,true为主题)
container.setPubSubDomain(true);
return container;
}
}
4.4 创建消息监听
@Component
public class MsgListener {
/**
* 监听队列1
* containerFactory可以不配置--》因为默认监听队列
* @param message
* @throws JMSException
*/
@JmsListener(destination = "queue-1")
public void getQueue1(TextMessage message) throws JMSException {
System.out.println("接收消息:"+message.getText());
}
/**
* 监听队列2
* @param message
* @throws JMSException
*/
@JmsListener(destination = "queue-2")
public void getQueue2(TextMessage message) throws JMSException {
System.out.println("接收消息:"+message.getText());
}
/**
* 监听主题1
* @param message message
* @throws JMSException
*/
@JmsListener(destination = "topic-1",containerFactory = "jmsTopicContainerFactory")
public void getTopic1(TextMessage message) throws JMSException {
System.out.println("接收消息:"+message.getText());
}
/**
* 监听主题2
* @param message
* @throws JMSException
*/
@JmsListener(destination = "topic-2",containerFactory = "jmsTopicContainerFactory")
public void getTopic2(TextMessage message) throws JMSException {
System.out.println("接收消息:"+message.getText());
}
}