如何为ActiveMQ队列创建Spring Boot使用者?

时间:2018-07-13 18:40:57

标签: java spring-boot activemq

我正在学习ActiveMQ,到目前为止,我已经制作了一个简单的Spring Boot生产者+消费者应用程序(此问题的目的称为 App1 ),该应用程序与ActiveMQ的本地实例进行通信,并且一切都按预期进行。

现在,我正在尝试运行一个只有使用者(没有生产者)的其他Spring Boot应用程序(在同一台计算机上,但确保未运行 App1 之后),但是当我启动它时应用程序,队列中的消息(我使用修改后的 App1 放入其中,删除了应用程序的使用者部分)不会被接收。在 App1 中,消息发布后,使用者立即打印出system.out打印语句,但在此仅限使用者的应用程序中不是这样。下面是我的侦听器组件类:

if @boo.save

我需要进行哪些更改才能实现所需的行为?

App1 package com.demo.listener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class Consumer { @JmsListener(destination = "testqueue") public void consume(String message) { System.out.println("Picked up message: " + message); } } 文件:

application.properties

App1 JmsConfig类

spring.activemq.in-memory=false
spring.activemq.pool.enabled=false
server.port=9000
activemq.broker-url=tcp://localhost:61616
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
security.basic.enabled=false
management.security.enabled=false

App1 生产者类

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsTemplate;

@Configuration
public class JmsConfig {

    @Value("${activemq.broker-url}")
    private String brokerUrl;

    @Bean
    public Queue queue() {
        return new ActiveMQQueue("testqueue");
    }

    @Bean
    public ActiveMQConnectionFactory activeMQConnectionFactory() {

        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
        factory.setBrokerURL(brokerUrl);
        return factory;
    }

    @Bean
    public JmsTemplate jmsTemplate() {
        return  new JmsTemplate(activeMQConnectionFactory());
    }

}

App1 消费者类与我在仅消费者应用(上面列出)中使用的类相同。

1 个答案:

答案 0 :(得分:1)

对于您的消费者应用程序,您确实需要为消费者JMStemplate添加Pool连接工厂和JMS消息侦听器工厂,以开始接收消息。

@Configuration
@EnableJms
public class ConsumerConfig {

  @Value("${activemqbrokerurl}")
  private String brokerUrl;

  @Bean
  public ActiveMQConnectionFactory activeMQConnectionFactory() {
    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
    activeMQConnectionFactory.setBrokerURL(brokerUrl);
    return activeMQConnectionFactory;
  }

  @Bean
  public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(activeMQConnectionFactory());
    factory.setConcurrency("{#setDesiredConcurrency}");
    return factory;
  }
}
  

应该使用Spring的MessagListenerContainer来消耗消息。这提供了MDB的所有功能-有效的JMS使用和消息监听器的池化-但不需要完整的EJB容器。

您可以使用activemq-pool org.apache.activemq.pool.PooledConnectionFactory以便为您的使用者集合有效地合并连接和会话,或者可以使用Spring JMS org.springframework.jms.connection.CachingConnectionFactory来达到相同的效果。

您可以详细了解here