spring boot 融入activeMQ

一、activeMQ:

1.下载:http://activemq.apache.org/download.html

2.解压文件,在bin/win64(如果你的电脑是32位的,打开win32文件夹),双击activemq.bat,启动activeMQ服务器

二、创建spring boot项目:

1、项目名称jms_activeMQ_demo

2、pom.xml:

<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>1.4.2.RELEASE</version>
    </parent>
    
   <artifactId>jms_activeMQ_demo</artifactId>
   <packaging>war</packaging>
   
  
  <dependencies>
    <!-- 热部署 --> 
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>provided</scope>
    </dependency>
    <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> <!-- json格式化 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!-- activemq -->
         <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-activemq</artifactId>  
        </dependency> 
        <dependency>
          <groupId>org.apache.activemq</groupId>
          <artifactId>activemq-pool</artifactId>
          <version>5.15.1</version>
        </dependency>  
        <dependency>
              <groupId>net.sf.json-lib</groupId>
              <artifactId>json-lib</artifactId>
              <classifier>jdk15</classifier>
              <version>2.3</version>
        </dependency>
   </dependencies>
   
   <build>
     <plugins>
              <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <configuration>
                         <warName>${project.artifactId}</warName>   
                    </configuration>
                </plugin>
     </plugins>
  </build>
</project>

3、application.properties文件:

# Tomcat
server.port=8761
server.servlet-path=/


###REDIS 
#######    #######################
# database name
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.in-memory=true
#如果此处设置为true,需要加activemq-pool依赖包,否则会自动配置失败,报JmsMessagingTemplate注入失败  
spring.activemq.pool.enabled=false
#配置消息模型为pub/sub方式,在application.properties添加如下配置信息
#这里简单对这个配置说明下:如果为True,则是Topic;如果是false或者默认,则是queue
spring.jms.pub-sub-domain=true

4.生产者开发:

 /**
*
 * @author 卫江波
 * @2018年1月4日上午11:11:30
 */
@Service
public class Producer {

    //也可以注入JmsTemplate,JmsMessagingTemplate对JmsTemplate进行了封装  
    @Autowired
    private JmsMessagingTemplate jmsTemplate;
    
    public void sendMessage(Destination destination, final String message){  
        jmsTemplate.convertAndSend(destination, message);  
    }

    //接收通道名为out.queue的信息
    @JmsListener(destination = "out.queue")  
    public void receiveQueue(String text) {  
        System.out.println("i am product ,i recevice return :"+text);  
    } 
}

5.接受者开发:

/**
 * 接收消息    示例代码
 * 
 * @author 卫江波
 * @2018年1月3日上午11:14:19
 */
@Component
public class Consumer {
    
    
     /**接收消息的方法*/
    //@JmsListener(destination = "mytest.queue")
    @JmsListener(destination = "mytest.topic")
    @SendTo("out.queue")  //该注解的意思是将return回的值,再发送的"out.queue"队列中
    public String receiveMessage1(String message){
        System.out.println(" I am consumer1,i receive message:" + message);
        if(!StringUtils.isEmpty(message)){
             JSONObject msg = JSONObject.fromObject(message);
             System.out.println("I am consumer1,i receive result:"+msg.getString("result"));
        }
        return "return de context1";
    }
    
     /**接收消息的方法*/
    //@JmsListener(destination = "mytest.queue")
    @JmsListener(destination = "mytest.topic")
    @SendTo("out.queue")  //该注解的意思是将return回的值,再发送的"out.queue"队列中
    public String receiveMessage2(String message){
        System.out.println(" I am consumer2,i receive message:" + message);
        if(!StringUtils.isEmpty(message)){
             JSONObject msg = JSONObject.fromObject(message);
             System.out.println("I am consumer2,i receive result:"+msg.getString("result"));
        }
        return "return de context2";
    }
}

6.测试类编写:

/**
 * 点对点:消息生产者生产消息发布到queue中,然后消息消费者从queue中取出,并且消费消息。这里需要注意:消息被消费者消费以后,queue中不再有存储,
 * 所以消息消费者不可消费到已经被消费的消息。Queue支持存在多个消息消费者,但是对一个消息而言,只会有一个消费者可以消费。
 * 发布/订阅:消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
 * @author 卫江波
 * @2018年1月4日上午11:20:39
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootJmsTest {
    
         @Autowired  
        private Producer producer;  
          
        @Test  
        public void contextLoads() throws InterruptedException {  
             // 组装数据
            JSONObject data = new JSONObject();
            data.put("result", "本地测试,activeMQ");
            //JMS规范两种常用的消息模型:点对点(point  to point ,queue)和发布/订阅(publish/subscribe,topic)。
            //Destination queue = new ActiveMQQueue("mytest.queue"); 
            Destination topic = new ActiveMQTopic("mytest.topic");
            // 推送消息
            //producer.sendMessage(queue, data.toString()); 
            producer.sendMessage(topic, data.toString());  
            System.out.println("  消息 发送完毕   "); 
        }  
}

猜你喜欢

转载自my.oschina.net/u/3409876/blog/1602371