activemq + springboot2.0.5.release配置及使用
阿新 • • 發佈:2018-12-12
1. pom.xml檔案
<!-- 使用activemq必須:fastjson可以用其他,看喜好 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> </parent> <dependencies> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.35</version> </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.6</version>--> <!--</dependency>--> </dependencies>
2. springboot配置檔案 ( yml檔案格式 )
spring: activemq: ###### activemq 配置 user: admin password: admin broker-url: tcp://48.86.111.52:61616 # activemq服務ip,這裡我改過ip了,你們連不上 in-memory: true # 是否使用記憶體儲存,提升效能 send-timeout: 10000ms #傳送超時時間 close-timeout: 60s #超時關閉時間 pool: enabled: false #是否啟用連線池,如果要使用activemq連線池,需要加依賴包 <artifactId>activemq-pool</artifactId>(不過我試過沒有用,可能是版本問題) # packages: # trust-all: true #注意:物件傳輸需開啟包白名單 否則會報錯(建議這裡註釋掉,傳輸字串)
3. 生產者、消費者模式
生產:
package com.wqm.controller.Common; import com.alibaba.fastjson.JSON; import com.wqm.entity.pojo.TUser; import org.apache.activemq.command.ActiveMQQueue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import javax.jms.Destination; import java.util.Date; /** * @author: wangqinmin * @Date: 2018/10/24 10:37 * @Description: 測試 */ @RestController public class MQController { @Autowired private JmsMessagingTemplate jmsTemplate; /** * 測試: 生產者、消費者模式 */ @PostMapping("/mqtest") public void mqTest() { // wqm.queue --> 自定義需要被監聽的佇列名 Destination destination = new ActiveMQQueue("wqm.queue"); TUser tUser = new TUser(); tUser.setAge(24); tUser.setCity("成都"); tUser.setCreatetime(new Date()); tUser.setId(1); tUser.setSex(2); tUser.setToken("史上最長的token"); // 將物件轉字串 String message = JSON.toJSONString(tUser); // 傳送非同步訊息 jmsTemplate.convertAndSend(destination, message); } }
消費:
package com.wqm.common.activemq;
import com.alibaba.fastjson.JSON;
import com.wqm.entity.pojo.TUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
/**
* @Auther: wangqinmin
* @Date: 2018/10/24 10:32
* @Description:
*/
@Service
public class Consumer {
private static final Logger logger = LoggerFactory.getLogger(Consumer.class);
/**
* 使用JmsListener配置消費者監聽的佇列,其中text是接收到的訊息
* @JmsListener(destination = "wqm.queue") 指定要監聽的佇列
*
* @param text
*/
@JmsListener(destination = "wqm.queue")
public void receiveQueue1(String text) {
// 將字串轉為物件
TUser tUser = JSON.parseObject(text, TUser.class);
System.out.println(tUser.getAge());
System.out.println(tUser.getCity());
System.out.println(tUser.getToken());
}
}
上面步驟適用於 生產消費模式
一般上面就適用於大部分需求了。下面用的很少。
4. 訂閱模式(pub/sub模式)
1. 自定義類,開啟訂閱模式
package com.wqm.common.config.activemq;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
import javax.jms.ConnectionFactory;
/**
* @author: wangqinmin
* @date: 2018/10/24 11:56
* @Description: 當使用activemq的訂閱模式(pub/sub模式), 配置如下程式碼,生產消費模式不需要編寫該類
*/
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class MyContainerFactory {
@Bean(name = "myJmsContainerFactory")
JmsListenerContainerFactory<?> getJmsListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
// 開啟訂閱模式
factory.setPubSubDomain(false);
return factory;
}
}
生產:
@Autowired
private JmsMessagingTemplate jmsTemplate;
/**
* 測試: 釋出、訂閱模式
*/
@PostMapping("/mqTest1")
public void mqTest1() {
for (int i = 0; i < 100; i++) {
// 自定義釋出端佇列名 wqm.topic
Destination destination = new ActiveMQTopic("wqm.topic");
// 傳送訊息 :"hello, 兄dei (topic)!!!"
jmsTemplate.convertAndSend(destination, "hello, 兄dei (topic)!!!");
}
}
消費:
// 指定監聽佇列名,和 開啟自定義訂閱模式
@JmsListener(destination = "wqm.topic", containerFactory = "myJmsContainerFactory")
public void subscriber(String text) {
System.err.println("消費訂閱訊息=======》:" + text);
}
完工 !!!