本文介绍了spring boot整合jms(activemq实现),分享给大家,也给自己留个学习笔记。
一、安装activemq
具体的安装步骤,请参考我的另一篇文章:http://www.zzvips.com/article/135795.html
二、新建spring boot工程,并加入jms(activemq)依赖
三、工程结构
pom依赖如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
<?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配置文件
1
2
3
4
5
6
|
## 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注入失败 |
1
2
3
4
5
|
<dependency> <groupid>org.apache.activemq</groupid> <artifactid>activemq-pool</artifactid> <!-- <version> 5.7 . 0 </version> --> </dependency> |
五、消息生产者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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); } } |
六、消息消费者
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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
七、测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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!!!" ); } } } |
测试结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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这个消费者来进行下改造,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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进行改造,使其既能生产报文,又能消费队列中的报文,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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); } } |
测试结果如下:
1
2
3
4
5
6
7
8
9
10
|
从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!!! |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/liuchuanhong1/article/details/54603546