ActiveMQ--整合SpringBoot
- 整合队列
- 队列生产者
- 新建maven工程并设置包名类名
- 工程名:boot_mq_produce
- 包名:com.model
- 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.5.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.model.avtivemq</groupId> <artifactId>boot_mq_produce</artifactId> <version>0.0.1-SNAPSHOT</version> <name>boot_mq_produce</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-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> <version>2.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
-
- application.yaml
-
server: port: 7777 spring: activemq: broker-url: tcp://192.168.56.130:61616 user: admin password: admin jms: pub-sub-domain: false #false = Queue true = Topic myqueue: boot-activemq-queue #自定义队列名称
-
- 配置Bean:类似spring框架的applicationContext.xml文件
-
package com.model.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; @EnableJms @Component public class ConfigBean { @Value("${myqueue}") //读取到了yaml中的值 private String myQueue; @Bean public Queue queue(){ return new ActiveMQQueue(myQueue); } }
-
- Queue_Produce
-
package com.model.produce; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Component; import javax.jms.Queue; import java.util.UUID; @Component public class Queue_Produce { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @Autowired private Queue queue; public void produceMsg(){ jmsMessagingTemplate.convertAndSend(queue,"********:"+ UUID.randomUUID().toString().substring(0,6)); } }
-
- 主动启动类MainApp_Produce
-
package com.model; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.stereotype.Component; @SpringBootApplication public class MainApp_Produce { public static void main(String[] args) { SpringApplication.run(MainApp_Produce.class, args); } }
-
- 测试单元
-
package com.model.avtivemq; import com.model.MainApp_Produce; import com.model.produce.Queue_Produce; 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; import javax.annotation.Resource; import javax.annotation.security.RunAs; @SpringBootTest(classes = MainApp_Produce.class) @WebAppConfiguration @RunWith(SpringJUnit4ClassRunner.class) class BootMqProduceApplicationTests { @Resource private Queue_Produce queue_produce; @Test public void contextLoads() throws Exception { queue_produce.produceMsg(); } }
-
没只执行一次test就会向后台发送一条消息
-
-
- 新要求:要求没隔3秒网MQ中推送消息,以下定时发送Case,案例修改
- 修改Queue_Produce
-
package com.model.produce; 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 Queue_Produce { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @Autowired private Queue queue; public void produceMsg(){ jmsMessagingTemplate.convertAndSend(queue,"********:"+ UUID.randomUUID().toString().substring(0,6)); } @Scheduled(fixedDelay = 3000)//定时投放信息 public void produceMsgScheduled(){ jmsMessagingTemplate.convertAndSend(queue,"********:"+ UUID.randomUUID().toString().substring(0,6)); System.out.println("*********produceMsgScheduled send over!***********"); } }
-
- 修改主启动类
-
package com.model.produce; 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 Queue_Produce { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @Autowired private Queue queue; public void produceMsg(){ jmsMessagingTemplate.convertAndSend(queue,"********:"+ UUID.randomUUID().toString().substring(0,6)); } @Scheduled(fixedDelay = 3000)//定时投放信息 public void produceMsgScheduled(){ jmsMessagingTemplate.convertAndSend(queue,"********:"+ UUID.randomUUID().toString().substring(0,6)); System.out.println("*********produceMsgScheduled send over!***********"); } }
-
- 直接启动主类,间隔发送消息
-
- 修改Queue_Produce
- 新建maven工程并设置包名类名
- 队列消费者
- 新建maven工程包括工程名和包名
- pom.xml :和生产者一样
- applicationContext.yaml :修改一下端口号即可
- Queue_Consumer :
-
package com.model.consumer; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; import javax.jms.JMSException; import javax.jms.TextMessage; @Component public class Queue_Consumer { @JmsListener(destination = "${myqueue}") public void receive(TextMessage textMessage) throws JMSException { System.out.println("****消费者消费消息:"+textMessage.getText()); } }
- 以前我们需要自己配置一个监听器类:配置监听器就可以实现消费者自动给读取消费队列中的消息,不用我们运行一次消费一次,
- springboot为我们配置一个注解 JmsListener(destination=“队列名称”):我们只需告诉监听器需要监听那个队列即可实现自动监听机制
-
- 主启动类
- 队列生产者
- 整合发布和订阅
- topic生产者
- 新建maven工程并设置包名类名
- 工程名:boot_mq_topic_produce
- 包名:com.model
- pom.xml
- applicaiton.yaml
-
server: port: 6666 spring: activemq: broker-url: tcp://192.168.56.130:61616 user: admin password: admin jms: pub-sub-domain: true #false = Queue true = Topic myqueue: boot-activemq-queue #自定义队列名称 mytopic: boot-activemq-topic #自定义的topic的名称
-
- 配置Bean:类似spring框架的appliacationContext.xml文件(配置了从配置文件内获取topic名称,根据名称创建一个topic对象并放入到springboot容器中)
-
package com.model.config; 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; @EnableJms @Component public class ConfigBean { @Value("${mytopic}") //读取到了yaml中的值 private String myTopic; @Bean public Topic topic(){ return new ActiveMQTopic(myTopic); } }
-
- Topic_Produce(根据容器中的Topic和消息的的装饰类JmsMessgeingTemplate共同修饰,将消息发送发到JMS服务器)
-
package com.model.produce; 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 Topic_Produce { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @Autowired private Topic topic; @Scheduled(fixedDelay = 3000) public void produceTopic(){ jmsMessagingTemplate.convertAndSend(topic,"主题消息:"+UUID.randomUUID().toString().substring(0,6)); } }
-
- 主启动类MainApp_Topic_Produce
- 新建maven工程并设置包名类名
- topic消费者
- 新建maven工程并设置包名类名
- 工程名:boot_mq_topic_consumer
- 包名:com.model
- pom.xml
- application.yaml
- Topic_Consumer
-
package com.model.consumer; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; import javax.jms.JMSException; import javax.jms.TextMessage; @Component public class Topic_Consumer { @JmsListener(destination = "${mytopic}")//监听topic public void receive(TextMessage textMessage) throws JMSException { System.out.println("****消费者消费消息:"+textMessage.getText()); } }
-
- 模拟两个订阅者著启动类,先启动订阅者在启动发布者
- MainApp5555
- MainApp5566
- 先启动消费者,在启动生产者,这里我们启动俩个消费者,消费则会监听对类中的topic
-
- 新建maven工程并设置包名类名
- topic生产者