1. 程式人生 > 實用技巧 >SpringBoot整合ActiveMq

SpringBoot整合ActiveMq

新建一個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=5000
spring: 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;

    @Resource
    
private 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"}