SpringBoot整合ActiveMq
阿新 • • 發佈:2020-06-29
新建一個SpringBoot專案,版本為:2.2.6.RELEASE,整合ActiveMq需要引用的pom為依賴及配置檔案如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency>
#mq spring.activemq.broker-url: failover:(tcp://127.0.0.1:61616)?maxReconnectAttempts=3&maxReconnectDelay=5000spring: activemq: user: admin password: admin packages: trust-all: true spring.activemq.in-memory: false #true表示使用連線池;false時,每傳送一條資料建立一個連線 spring.activemq.pool.enabled: true #連線池最大連線數 spring.activemq.pool.max-connections: 10 #空閒的連線過期時間,預設為30秒 spring.activemq.pool.idle-timeout: 30000 #強制的連線過期時間,與idleTimeout的區別在於:idleTimeout是在連線空閒一段時間失效,而expiryTimeout不管當前連線的情況,只要達到指定時間就失效。預設為0,never spring.activemq.pool.expiry-timeout: 0 #mq end jms.card.active.message.handler.destination: jms.card.active.message.handler.destination
傳送訊息程式碼如下:
public class CardActiveMessageSender { private static final Logger logger = LoggerFactory.getLogger(CardActiveMessageSender.class); @Value("${jms.card.active.message.handler.destination}") String destinationName; @Resourceprivate JmsMessagingTemplate jmsMessagingTemplate; public void sendMsg(OrdersDto ordersDto){ logger.info("傳送入賬流水:{}", JsonUtil.objToJson(ordersDto)); String tradeString = JsonUtil.objToJson(ordersDto); jmsMessagingTemplate.convertAndSend(destinationName,tradeString); logger.info("傳送入賬流水成功"); } }
接受訊息程式碼如下:
public class CardActiveMessageHandler {
private static final Logger logger = LoggerFactory.getLogger(CardActiveMessageHandler.class);
@JmsListener(destination = "${jms.card.active.message.handler.destination}")
public void handleMessage(String request){
try {
logger.info("接受訊息如下:{}",request);
} catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
}
按上面的配置啟動專案,會報錯,錯誤資訊如下:
*************************** APPLICATION FAILED TO START *************************** Description: A component required a bean of type 'org.springframework.jms.core.JmsMessagingTemplate' that could not be found. The following candidates were found but could not be injected: - Bean method 'jmsMessagingTemplate' in 'JmsAutoConfiguration.MessagingTemplateConfiguration' not loaded because Ancestor org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration did not match Action: Consider revisiting the entries above or defining a bean of type 'org.springframework.jms.core.JmsMessagingTemplate' in your configuration.
從報錯可以看出jmsMessagingTemplate未被正常注入。
解決方式有兩種:
1.增加pom依賴(springboot2.1+時引用):
<dependency> <groupId>org.messaginghub</groupId> <artifactId>pooled-jms</artifactId> </dependency>
重新編譯成功,此方式已經在本地驗證通過
如果是springboot2.0及以下版本則引用(本人未驗證)
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> </dependency>
上面兩種因為版本不同而引用不同依賴的原因是:兩種版本使用連線池時候的連線池物件不一樣,2.0以下版本使用的是PooledConnectionFactory,它存在於org.apache.activemq.pool.PooledConnectionFactory,2.1+版本使用的是JmsPoolConnectionFactory,它存在於org.messaginghub.pooled.jms.JmsPoolConnectionFactory。
2.使用@Configuration注入,配置如下:
@Configuration public class MQConfig { @Value("${spring.activemq.broker-url}") private String brokerUrl; @Value("${spring.activemq.user}") private String user; @Value("${spring.activemq.password}") private String password; @Bean public ConnectionFactory connectionFactory(){ ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); connectionFactory.setBrokerURL(brokerUrl); connectionFactory.setUserName(user); connectionFactory.setPassword(password); return connectionFactory; } @Bean public JmsTemplate genJmsTemplate(){ return new JmsTemplate(connectionFactory()); } @Bean public JmsMessagingTemplate jmsMessageTemplate(){ return new JmsMessagingTemplate(connectionFactory()); } }
重啟啟動專案成功,已在本地測試通過。
測試結果:
2020-06-29 15:50:50.711 [] [http-nio-8080-exec-1] INFO o.s.web.servlet.DispatcherServlet :Initializing Servlet 'dispatcherServlet' 2020-06-29 15:50:50.720 [] [http-nio-8080-exec-1] INFO o.s.web.servlet.DispatcherServlet :Completed initialization in 8 ms 2020-06-29 15:50:50.831 [] [http-nio-8080-exec-1] INFO c.y.p.d.m.s.CardActiveMessageSender :傳送入賬流水:{"orderBatchId":123456,"orderId":123456,"status":"1"} 2020-06-29 15:50:50.910 [] [http-nio-8080-exec-1] INFO c.y.p.d.m.s.CardActiveMessageSender :傳送入賬流水成功 2020-06-29 15:50:50.919 [] [DefaultMessageListenerContainer-1] INFO c.y.p.d.m.h.CardActiveMessageHandler :接受訊息如下:{"orderBatchId":123456,"orderId":123456,"status":"1"}