ActiveMQ
@Author:hanguixian
@Email:[email protected]
七 SpringBoot整合ActiveMQ
1 代碼
- 項目結構
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSMOhFZ6Z1VkVDbXRme5YUZuhmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxcDN5ATOzMjM4EjMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
- pom.xml
<?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.2.1.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.hgx</groupId>
<artifactId>springboot-activemq</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-activemq</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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
<version>2.2.1.RELEASE</version>
</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>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 配置:application.yml
server:
port: 8888
spring:
activemq:
broker-url: tcp://106.14.217.80:61616
user: admin
password: admin
jms:
pub-sub-domain: true # false=Queue true=Topic
#自定義隊列名稱
myQueue: boot-active-queue
#自定義主題名
myTopic: boot-active-Topic
- 配置類:ConfigBean.java
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
import javax.jms.Topic;
import javax.validation.Valid;
@Component
@EnableJms
public class ConfigBean {
@Value("${myQueue}")
private String myQueue ;
@Value("${myTopic}")
private String myTopic;
@Bean
public Queue queue(){
return new ActiveMQQueue(myQueue) ;
}
@Bean
public Topic topic(){
return new ActiveMQTopic(myTopic) ;
}
}
- springboot啟動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class SpringbootActivemqApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootActivemqApplication.class, args);
}
}
- 生産者-隊列:QueueProduce.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
import java.util.UUID;
@Component
public class QueueProduce {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Queue queue;
public void produceMsg() {
jmsMessagingTemplate.convertAndSend(queue, "kkkkk" + UUID.randomUUID().toString());
}
/**
* 3秒一次
*/
// @Scheduled(fixedDelay = 3000)
public void produceMSgScheduled() {
jmsMessagingTemplate.convertAndSend(queue, "produceMSgScheduled" + UUID.randomUUID().toString());
System.out.println("produceMSgScheduled.................");
}
}
- 消費者-隊列:QueueConsumer.java
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.TextMessage;
@Component
public class QueueConsumer {
@JmsListener(destination = "${myQueue}")
public void receive(TextMessage textMessage) throws JMSException {
System.out.println(".....消費者收到消息:" + textMessage.getText());
}
}
- 生産者-主題:TopicProduce.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
import javax.jms.Topic;
import java.util.UUID;
@Component
public class TopicProduce {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Topic topic;
public void produceMsg() {
jmsMessagingTemplate.convertAndSend(topic, "topic" + UUID.randomUUID().toString());
}
/**
* 3秒一次
*/
// @Scheduled(fixedDelay = 3000)
public void produceMSgScheduled() {
jmsMessagingTemplate.convertAndSend(topic, "produceMSgScheduled topic" + UUID.randomUUID().toString());
System.out.println("produceMSgScheduled topic.................");
}
}
- 消費者-主題:TopicConsumer.java
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.TextMessage;
@Component
public class TopicConsumer {
@JmsListener(destination = "${myTopic}")
public void receive(TextMessage textMessage) throws JMSException {
System.out.println(".....消費者收到消息:" + textMessage.getText());
}
}
- 測試類:
import com.hgx.activemq.produce.QueueProduce;
import com.hgx.activemq.produce.TopicProduce;
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.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@SpringBootTest(classes = SpringbootActivemqApplication.class)
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
class SpringbootActivemqApplicationTests {
@Autowired
private QueueProduce queueProduce ;
@Autowired
private TopicProduce topicProduce ;
@Test
public void testSend(){
queueProduce.produceMsg();
}
@Test
public void testSendSch(){
queueProduce.produceMSgScheduled();
}
@Test
public void testTopicSend(){
topicProduce.produceMsg();
}
@Test
public void testTopicSendSch(){
topicProduce.produceMSgScheduled();
}
}
- 說明:測試主題,修改配置
;測試隊列,修改jms.pub-sub-domain:true
。如果是使用間隔投遞,方法上使用jms.pub-sub-domain:false
注解,不需要啟動測試類,啟動springboot啟動類即可看到效果。@Scheduled(fixedDelay = xxx)