ActiveMQ--整合SpringBoot

  1. 整合队列
    • 队列生产者
      1. 新建maven工程并设置包名类名
        • 工程名:boot_mq_produce
        • 包名:com.model
      2. pom.xml
        1.   
          <?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>

           

      3. application.yaml
        1.   
          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 #自定义队列名称

           

      4. 配置Bean:类似spring框架的applicationContext.xml文件
        1. 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);
              }
          }

           

            
      5. Queue_Produce
        1. 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));
                  
              }
          }

           

            
      6. 主动启动类MainApp_Produce
        1.   
          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);
              }
          
          }

           

      7. 测试单元
        1. 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();
          
              }
          
          
          }

           

        2. 没只执行一次test就会向后台发送一条消息

        3.  

           

               
      8. 新要求:要求没隔3秒网MQ中推送消息,以下定时发送Case,案例修改  
        1. 修改Queue_Produce
          1.   
            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!***********");
                }
            }

             

        2. 修改主启动类
          1.  
            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!***********");
                }
            }

             

             
        3. 直接启动主类,间隔发送消息  
          1.  

             

             

              

              
    • 队列消费者
      • 新建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=“队列名称”):我们只需告诉监听器需要监听那个队列即可实现自动监听机制
      • 主启动类      
  2. 整合发布和订阅
    • topic生产者
      1. 新建maven工程并设置包名类名
        1. 工程名:boot_mq_topic_produce
        2. 包名:com.model
      2. pom.xml
      3. applicaiton.yaml
        1. 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的名称

           

            
      4. 配置Bean:类似spring框架的appliacationContext.xml文件(配置了从配置文件内获取topic名称,根据名称创建一个topic对象并放入到springboot容器中)
        1.   
          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);
              }
          }

           

      5. Topic_Produce(根据容器中的Topic和消息的的装饰类JmsMessgeingTemplate共同修饰,将消息发送发到JMS服务器)
        1. 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));
             }
          }

           

            
      6. 主启动类MainApp_Topic_Produce    
    • topic消费者
      1. 新建maven工程并设置包名类名
        1. 工程名:boot_mq_topic_consumer
        2. 包名:com.model
      2. pom.xml
      3. application.yaml
      4. Topic_Consumer
        1. 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());
              }
          }

           

            
      5. 模拟两个订阅者著启动类,先启动订阅者在启动发布者
        1. MainApp5555
        2. MainApp5566
      6. 先启动消费者,在启动生产者,这里我们启动俩个消费者,消费则会监听对类中的topic
      7.  

         

              
posted @ 2021-05-29 09:23  张紫韩  阅读(57)  评论(0编辑  收藏  举报