Spring Boot相同的代理消息重复到控制台

时间:2015-05-28 04:33:35

标签: spring spring-boot activemq

此刻我正在开发一个Spring Boot项目,此文本每秒都会在控制台上打印30秒,然后停止。

15:18:02.416  o.a.activemq.broker.TransportConnector : Connector vm://localhost started
15:18:03.480  o.a.activemq.broker.TransportConnector : Connector vm://localhost stopped
15:18:03.480  o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.10.1 (localhost, ID:Jordan-801993-L.local-55074-1432703875573-0:7) is shutting down
15:18:03.481  o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.10.1 (localhost, ID:Jordan-801993-L.local-55074-1432703875573-0:7) uptime 1.069 seconds
15:18:03.481  o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.10.1 (localhost, ID:Jordan-801993-L.local-55074-1432703875573-0:7) is shutdown
15:18:03.542  o.apache.activemq.broker.BrokerService : Using Persistence Adapter: MemoryPersistenceAdapter
15:18:03.543  o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.10.1 (localhost, ID:Jordan-801993-L.local-55074-1432703875573-0:8) is starting
15:18:03.543  o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.10.1 (localhost, ID:Jordan-801993-L.local-55074-1432703875573-0:8) started
15:18:03.543  o.apache.activemq.broker.BrokerService : For help or more information please see: http://activemq.apache.org
15:18:03.544  o.a.a.broker.jmx.ManagementContext     : JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
15:18:03.544  o.a.activemq.broker.TransportConnector : Connector vm://localhost started

该项目仍然可以正常工作,这很烦人。任何人都知道为什么会发生这种情况?

5 个答案:

答案 0 :(得分:9)

我无法深入解释为什么会发生这种情况,但它与ConnectionFactory自动配置的方式有关。

摆脱嵌入式代理不断重启的一种方法是在application.properties中启用池:

spring.activemq.pooled=true

要使用此功能,您还必须将以下依赖项添加到pom.xml

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-pool</artifactId>
</dependency> 

我已经挖掘了一些文档并最终找到了this

在页面底部显示:

  

使用ActiveMQConnectionFactory
  ...
  将在创建第一个连接时创建代理   ......

同样,这并没有完全解释发生了什么,但是一旦我发现启用池阻止了这种行为的发生,我就停止了挖掘。

答案 1 :(得分:2)

遇到同样的问题,但接受的答案没有帮助。找到the thread with explanation

  

如果存在某些内容,ActiveMQ将仅保留内存中队列。

     

如果在春天设置了队列以不缓存队列,那么ActiveMQ将继续启动/停止连接器。完整的appserver可以有效地缓存池中的队列内容,从而使其保持活动状态。

     

棒   在bean的def中为Spring JMS容器(org.springframework.jms.listener.DefaultMessageLi stenerContainer)修复问题。

@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setCacheLevelName("CACHE_CONNECTION"); //<-- the line fixed the problem
    configurer.configure(factory, connectionFactory);
    return factory;
}

答案 2 :(得分:2)

我们有Spring Boot 1.5服务,该服务通过JMSTemplate使用和发布,并且没有此问题,然后我们只有一个发布(因此没有JmsListener)并用这些消息填充日志-以及相关的WARN Temporary Store limit is 51200 mb ... resetting to maximum available disk space -在每次获取到/ healthcheck的GET上编写它们。您需要考虑其含义,但是可以使用属性设置禁用此行为,因此可以禁用所有相关日志记录:

management.health.jms.enabled=false

结果,您将看到jms输出中的/healthcheck块消失了-因此,请检查它是否实际上反映了服务所需的任何内容。 在该线程上的其他答案或在Startup error of embedded ActiveMQ: Temporary Store limit is 51200 mb中尝试过的答案,我们都没有成功。

答案 3 :(得分:0)

我做了什么,明确地创建了一个代理,并告诉Spring使用它而不是隐含的代理。通过这种方式,经纪人将保持活着:

@Configuration
public class MessagingConfig {

    private final static String BROKER_URL = "tcp://localhost:61616";

    @Bean
    public BrokerService brokerService() {
        BrokerService broker = new BrokerService();
        broker.addConnector(BROKER_URL);
        broker.setPersistent(false);
        broker.start();
        return broker;
    }

    @Bean
    public ActiveMQConnectionFactory connectionFactory() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL(BROKER_URL);
        return connectionFactory;
    }

}

答案 4 :(得分:0)

接受的答案不适合我,找到了另一种解决方案。也许会有所帮助:

我正在使用 Spring Boot 应用程序而需要 PooledConnectionFactory ,然后将此行添加到您的Application类中:

@SpringBootApplication(exclude = {ActiveMQAutoConfiguration.class})
public class MyApplication{...}

这将排除activemq自动配置,你不会在日志中看到垃圾。