新建maven工程,我的工程名叫SpringBootActiveMQProducer。
根据需要,在pom.xml中加入jar包的坐标,方便复制,我贴出来。
一、SpringBoot整合ActiveMQ 生产者
<?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 http://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.1.5.RELEASE</version>
<relativePath/>
</parent>
<groupId>org.wsy</groupId>
<artifactId>SpringBootActiveMQProducer</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</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-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml配置文件如下,注意冒号后面要加一个空格
server:
port: 7777
spring:
activemq:
broker-url: tcp://192.168.0.123:61616 # ActiveMQ服务器的地址和端口
user: admin
password: admin
jms:
pub-sub-domain: false # false:不使用pub-sub,也就是使用queue;true:使用pub-sub,也就是使用topic
myqueue: boot-activemq-queue # 队列的名称
创建ConfigBean.java,编写代码,代码如下。
package com.wsy.boot.activemq.config;
import org.apache.activemq.command.ActiveMQQueue;
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;
@Component
@EnableJms// 开启JMS适配的注解
public class ConfigBean {
@Value("${myqueue}")
private String myQueue;
@Bean
public Queue queue() {
return new ActiveMQQueue(myQueue);
}
}
创建QueueProducer.java,编写代码,代码如下
package com.wsy.boot.activemq.producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
@Component
public class QueueProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Queue queue;
public void produceMessage() {
jmsMessagingTemplate.convertAndSend(queue, "SpringBoot整合ActiveMQ");
}
}
创建Main.java,编写代码,代码如下。
package com.wsy.boot.activemq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
创建TestActiveMQ.java,编写代码,代码如下。
package com.wsy.boot.activemq;
import com.wsy.boot.activemq.producer.QueueProducer;
import org.junit.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 = Main.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestActiveMQ {
@Autowired
private QueueProducer queueProducer;
@Test
public void testSend() {
queueProducer.produceMessage();
}
}
运行测试类,测试类运行正常,在ActiveMQ的管理前台的queue中可以看到有一条记录了,SpringBoot和ActiveMQ的整合基本完成。
二、SpringBoot整合ActiveMQ之队列生产者间隔定投
假设现在有一个需求,每隔向队列中发送消息。
在QueueProducer.java中加一个方法,时间间隔是由注解里的fixedDelay控制的,代码如下
/**
* 每间隔3秒钟执行一次
*/
@Scheduled(fixedDelay = 3000)
public void produceMessageScheduled() {
jmsMessagingTemplate.convertAndSend(queue, "SpringBoot整合ActiveMQ的Scheduled()方法");
}
另外,还需要在Main.java里做点小改动,在Main类上面加一个@EnableScheduling注解。
然后启动Main类里的main()方法,可以发现produceMessageScheduled()方法每隔3秒钟执行一次。
还没有学SpringBoot,所以不是很理解为什么main()方法会调用produceMessageScheduled()方法,下面是自己的猜测,如果不对请大佬指正,不胜感激。
Main类上加了@EnableScheduling,表示开启了Schedule,produceMessageScheduled()方法上加了@Scheduled,所以运行Main类的main()方法时,SpringBoot会去找带有@Scheduled注解的方法去执行,所以就执行了produceMessageScheduled()方法。
三、SpringBoot整合ActiveMQ之队列消费者
新建maven工程,我的工程名叫SpringBootActiveMQConsumer。
根据需要,在pom.xml中加入jar包的坐标,方便复制,我贴出来。
<?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.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>boot-activemq-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot-activemq-consumer</name>
<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-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
<version>2.1.5.RELEASE</version>
</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://192.168.0.123:61616 # ActiveMQ服务器的地址和端口
user: admin
password: admin
jms:
pub-sub-domain: false # false:不使用pub-sub,也就是使用queue;true:使用pub-sub,也就是使用topic
myqueue: boot-activemq-queue # 队列的名称
创建QueueConsumer.java,编写代码,代码如下。
package com.wsy.boot.activemq.consumer;
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}")// 表明JmsListener监听的destination是什么
public void receive(TextMessage textMessage) throws JMSException {
System.out.println("消费者收到消息:"+textMessage.getText());
}
}
创建Main.java,编写代码,代码如下
package com.wsy.boot.activemq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
运行Main类的main方法,可以在控制台看到已经接收到了队列中的消息。
回想之前Spring和ActiveMQ整合的时候,需要配置一个监听器,写一个Listener类,现在只需要一个注解@JmsListener(destination = "${myqueue}"),简化了代码。
四、SpringBoot整合ActiveMQTopic生产者
新建maven工程,我的工程名叫SpringBootActiveMQTopicProducer
pom.xml文件参考前面的项目的配置
application.yml
server:
port:6666
spring:
activemq:
broker-url: tcp://10.5.96.48:61616
user: admin
password: admin
jms:
pub-sub-domain: true
mytopic: boot-activemq-topic
创建ConfigBean.java,编写代码,代码如下
package com.wsy.boot.activemq.config;
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.Topic;
@Component
@EnableJms// 开启JMS适配的注解
public class ConfigBean {
@Value("${mytopic}")
private String myTopic;
@Bean
public Topic topic() {
return new ActiveMQTopic(myTopic);
}
}
创建TopicProducer.java,编写代码,代码如下
package com.wsy.boot.activemq.producer;
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.Topic;
@Component
public class TopicProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Topic topic;
/**
* 每间隔3秒钟执行一次
*/
@Scheduled(fixedDelay = 3000)
public void produceMessageScheduled() {
jmsMessagingTemplate.convertAndSend(topic, "SpringBoot整合ActiveMQ的Scheduled()方法");
}
}
创建Main.java,编写代码,代码如下。
package com.wsy.boot.activemq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
五、SpringBoot整合ActiveMQ之主题消费者
pom.xml 参考前面的项目的配置
application.yml与生产者的相似,只是端口号需要修改
server:
port: 5555
spring:
activemq:
broker-url: tcp://10.5.96.48:61616
user: admin
password: admin
jms:
pub-sub-domain: true
mytopic: boot-activemq-topic
创建TopicConsumer.java,编写代码,代码如下。
package com.wsy.boot.activemq.consumer;
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}")// 表明JmsListener监听的destination是什么
public void receive(TextMessage textMessage) throws JMSException {
System.out.println("消费者收到消息:"+textMessage.getText());
}
}
创建Main.java,编写代码,代码如下。
package com.wsy.boot.activemq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
因为是topic,所以需要先启动消费者,再启动生产者,我们启动消费者,再启动生产者,一切顺利,SpringBoot整合ActiveMQ的Topic部分就完成了,如果前面说的SpringBoot整合ActiveMQ的Queue能看懂,这里也就能看懂,只是做了下比较小的改动。
原文链接
https://blog.csdn.net/qq_36059561/article/details/103834916
https://blog.csdn.net/qq_36059561/article/details/103836747
https://blog.csdn.net/qq_36059561/article/details/103843048
https://blog.csdn.net/qq_36059561/article/details/103844020
https://blog.csdn.net/qq_36059561/article/details/103844212