详解spring boot整合JMS(ActiveMQ实现)
程序员文章站
2024-04-02 10:30:52
本文介绍了spring boot整合jms(activemq实现),分享给大家,也给自己留个学习笔记。
一、安装activemq
具体的安装步骤,请参考我的另一...
本文介绍了spring boot整合jms(activemq实现),分享给大家,也给自己留个学习笔记。
一、安装activemq
具体的安装步骤,请参考我的另一篇文章:
二、新建spring boot工程,并加入jms(activemq)依赖
三、工程结构
pom依赖如下:
<?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> <groupid>com.chhliu.springboot.jms</groupid> <artifactid>springboot-jms</artifactid> <version>0.0.1-snapshot</version> <packaging>jar</packaging> <name>springboot-jms</name> <description>demo project for spring boot jms</description> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>1.4.3.release</version> <relativepath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceencoding>utf-8</project.build.sourceencoding> <project.reporting.outputencoding>utf-8</project.reporting.outputencoding> <java.version>1.7</java.version> </properties> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-activemq</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> </plugin> </plugins> </build> </project>
四、修改application.properties配置文件
## url of the activemq broker. auto-generated by default. for instance `tcp://localhost:61616` # failover:(tcp://localhost:61616,tcp://localhost:61617) # tcp://localhost:61616 spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.in-memory=true spring.activemq.pool.enabled=false //如果此处设置为true,需要加如下的依赖包,否则会自动配置失败,报jmsmessagingtemplate注入失败
<dependency> <groupid>org.apache.activemq</groupid> <artifactid>activemq-pool</artifactid> <!-- <version>5.7.0</version> --> </dependency>
五、消息生产者
package com.chhliu.springboot.jms; import javax.jms.destination; import org.springframework.beans.factory.annotation.autowired; import org.springframework.jms.core.jmsmessagingtemplate; import org.springframework.stereotype.service; @service("producer") public class producer { @autowired // 也可以注入jmstemplate,jmsmessagingtemplate对jmstemplate进行了封装 private jmsmessagingtemplate jmstemplate; // 发送消息,destination是发送到的队列,message是待发送的消息 public void sendmessage(destination destination, final string message){ jmstemplate.convertandsend(destination, message); } }
六、消息消费者
package com.chhliu.springboot.jms; import org.springframework.jms.annotation.jmslistener; import org.springframework.stereotype.component; @component public class consumer { // 使用jmslistener配置消费者监听的队列,其中text是接收到的消息 @jmslistener(destination = "mytest.queue") public void receivequeue(string text) { system.out.println("consumer收到的报文为:"+text); } }
消费者2的代码同上,注意,消息消费者的类上必须加上@component,或者是@service,这样的话,消息消费者类就会被委派给listener类,原理类似于使用sessionawaremessagelistener以及messagelisteneradapter来实现消息驱动pojo
七、测试
package com.chhliu.springboot.jms; import javax.jms.destination; import org.apache.activemq.command.activemqqueue; 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.springrunner; @runwith(springrunner.class) @springboottest public class springbootjmsapplicationtests { @autowired private producer producer; @test public void contextloads() throws interruptedexception { destination destination = new activemqqueue("mytest.queue"); for(int i=0; i<100; i++){ producer.sendmessage(destination, "myname is chhliu!!!"); } } }
测试结果如下:
consumer2收到的报文为:myname is chhliu!!! consumer收到的报文为:myname is chhliu!!! consumer2收到的报文为:myname is chhliu!!! consumer收到的报文为:myname is chhliu!!! consumer2收到的报文为:myname is chhliu!!! consumer收到的报文为:myname is chhliu!!! consumer2收到的报文为:myname is chhliu!!! consumer收到的报文为:myname is chhliu!!! consumer2收到的报文为:myname is chhliu!!! consumer收到的报文为:myname is chhliu!!! consumer2收到的报文为:myname is chhliu!!! consumer收到的报文为:myname is chhliu!!! consumer2收到的报文为:myname is chhliu!!!
经过上面的几个步骤,spring boot和jms就基本上整合完成了,是不是使用起来很方便了!
八、实现双向队列
1、下面首先来对consumer2这个消费者来进行下改造,代码如下:
package com.chhliu.springboot.jms; import org.springframework.jms.annotation.jmslistener; import org.springframework.messaging.handler.annotation.sendto; import org.springframework.stereotype.component; @component public class consumer2 { @jmslistener(destination = "mytest.queue") @sendto("out.queue") public string receivequeue(string text) { system.out.println("consumer2收到的报文为:"+text); return "return message"+text; } }
从上面的代码可以看出,我们在receivequeue方法上面多加了一个注解@sendto("out.queue"),该注解的意思是将return回的值,再发送的"out.queue"队列中,下面我们再来跑一下前面的测试,在监控页面中,我们发现,"out.queue"队列中已经有内容了,如下:
进入browse界面观看:
最后看下收到的具体信息:
我们发现,该队列中的消息,就是我们返回的值!
九、对producer进行改造
通过上面的示例,我们现在对producer进行改造,使其既能生产报文,又能消费队列中的报文,代码如下:
package com.chhliu.springboot.jms; import javax.jms.destination; import org.springframework.beans.factory.annotation.autowired; import org.springframework.jms.annotation.jmslistener; import org.springframework.jms.core.jmsmessagingtemplate; import org.springframework.stereotype.service; @service("producer") public class producer { @autowired private jmsmessagingtemplate jmstemplate; public void sendmessage(destination destination, final string message){ jmstemplate.convertandsend(destination, message); } @jmslistener(destination="out.queue") public void consumermessage(string text){ system.out.println("从out.queue队列收到的回复报文为:"+text); } }
测试结果如下:
从out.queue队列收到的回复报文为:return messagemyname is chhliu!!! consumer收到的报文为:myname is chhliu!!! consumer2收到的报文为:myname is chhliu!!! 从out.queue队列收到的回复报文为:return messagemyname is chhliu!!! consumer收到的报文为:myname is chhliu!!! consumer2收到的报文为:myname is chhliu!!! 从out.queue队列收到的回复报文为:return messagemyname is chhliu!!! consumer收到的报文为:myname is chhliu!!! consumer2收到的报文为:myname is chhliu!!! 从out.queue队列收到的回复报文为:return messagemyname is chhliu!!!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
详解spring boot整合JMS(ActiveMQ实现)
-
Spring Boot整合Elasticsearch实现全文搜索引擎案例解析
-
Spring Boot+Drools规则引擎整合详解
-
spring boot使用logback实现多环境日志配置详解
-
Spring AOP如何整合redis(注解方式)实现缓存统一管理详解
-
spring boot整合redis实现shiro的分布式session共享的方法
-
spring boot整合spring security实现基于rabc的权限控制
-
Spring整合JMS(一)——基于ActiveMQ实现 博客分类: Spring-JMS Spring-jmsjmsactivemq
-
深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例 博客分类: 【48】、ActiveMQ activeMQ
-
详解在Spring Boot框架下使用WebSocket实现消息推送