本文介紹了spring boot整合jms(activemq實現(xiàn)),分享給大家,也給自己留個學(xué)習(xí)筆記。
一、安裝activemq
具體的安裝步驟,請參考我的另一篇文章:http://www.ythuaji.com.cn/article/135795.html
二、新建spring boot工程,并加入jms(activemq)依賴
三、工程結(jié)構(gòu)
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 //如果此處設(shè)置為true,需要加如下的依賴包,否則會自動配置失敗,報jmsmessagingtemplate注入失敗 |
1
2
3
4
5
|
<dependency> <groupid>org.apache.activemq</groupid> <artifactid>activemq-pool</artifactid> <!-- <version> 5.7 . 0 </version> --> </dependency> |
五、消息生產(chǎn)者
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進(jìn)行了封裝 private jmsmessagingtemplate jmstemplate; // 發(fā)送消息,destination是發(fā)送到的隊列,message是待發(fā)送的消息 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配置消費者監(jiān)聽的隊列,其中text是接收到的消息 @jmslistener (destination = "mytest.queue" ) public void receivequeue(string text) { system.out.println( "consumer收到的報文為:" +text); } } |
消費者2的代碼同上,注意,消息消費者的類上必須加上@component,或者是@service,這樣的話,消息消費者類就會被委派給listener類,原理類似于使用sessionawaremessagelistener以及messagelisteneradapter來實現(xiàn)消息驅(qū)動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!!!" ); } } } |
測試結(jié)果如下:
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!!! |
經(jīng)過上面的幾個步驟,spring boot和jms就基本上整合完成了,是不是使用起來很方便了!
八、實現(xiàn)雙向隊列
1、下面首先來對consumer2這個消費者來進(jìn)行下改造,代碼如下:
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回的值,再發(fā)送的"out.queue"隊列中,下面我們再來跑一下前面的測試,在監(jiān)控頁面中,我們發(fā)現(xiàn),"out.queue"隊列中已經(jīng)有內(nèi)容了,如下:
進(jìn)入browse界面觀看:
最后看下收到的具體信息:
我們發(fā)現(xiàn),該隊列中的消息,就是我們返回的值!
九、對producer進(jìn)行改造
通過上面的示例,我們現(xiàn)在對producer進(jìn)行改造,使其既能生產(chǎn)報文,又能消費隊列中的報文,代碼如下:
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隊列收到的回復(fù)報文為:" +text); } } |
測試結(jié)果如下:
1
2
3
4
5
6
7
8
9
10
|
從out.queue隊列收到的回復(fù)報文為: return messagemyname is chhliu!!! consumer收到的報文為:myname is chhliu!!! consumer2收到的報文為:myname is chhliu!!! 從out.queue隊列收到的回復(fù)報文為: return messagemyname is chhliu!!! consumer收到的報文為:myname is chhliu!!! consumer2收到的報文為:myname is chhliu!!! 從out.queue隊列收到的回復(fù)報文為: return messagemyname is chhliu!!! consumer收到的報文為:myname is chhliu!!! consumer2收到的報文為:myname is chhliu!!! 從out.queue隊列收到的回復(fù)報文為: return messagemyname is chhliu!!! |
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://blog.csdn.net/liuchuanhong1/article/details/54603546