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

Spring引导相同的代理消息重复到控制台,spring,spring-boot,activemq,Spring,Spring Boot,Activemq,我现在正在做一个Spring Boot项目,在停止之前,每隔30秒,这个文本就会被打印到控制台上 15:18:02.416 o.a.activemq.broker.TransportConnector:Connector vm://localhost已启动 15:18:03.480 o.a.activemq.broker.TransportConnector:连接器vm://localhost已停止 15:18:03.480 o.apache.activemq.broker.BrokerServ

我现在正在做一个Spring Boot项目,在停止之前,每隔30秒,这个文本就会被打印到控制台上

15:18:02.416 o.a.activemq.broker.TransportConnector:Connector vm://localhost已启动
15:18:03.480 o.a.activemq.broker.TransportConnector:连接器vm://localhost已停止
15:18:03.480 o.apache.activemq.broker.BrokerService:apache activemq 5.10.1(本地主机,ID:Jordan-801993-L.local-55074-14320703875573-0:7)正在关闭
15:18:03.481 o.apache.activemq.broker.BrokerService:apache activemq 5.10.1(localhost,ID:Jordan-801993-L.local-55074-14320703875573-0:7)正常运行时间1.069秒
15:18:03.481 o.apache.activemq.broker.BrokerService:apache activemq 5.10.1(本地主机,ID:Jordan-801993-L.local-55074-14320703875573-0:7)已关闭
15:18:03.542 o.apache.activemq.broker.BrokerService:使用持久性适配器:MemoryPersistenceAdapter
15:18:03.543 o.apache.activemq.broker.BrokerService:apache activemq 5.10.1(本地主机,ID:Jordan-801993-L.local-55074-14320703875573-0:8)正在启动
15:18:03.543 o.apache.activemq.broker.BrokerService:apache activemq 5.10.1(本地主机,ID:Jordan-801993-L.local-55074-14320703875573-0:8)已启动
15:18:03.543 o.apache.activemq.broker.BrokerService:有关帮助或更多信息,请参阅:http://activemq.apache.org
15:18:03.544 o.a.a.broker.jmx.ManagementContext:jmx控制台可以连接到服务:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
15:18:03.544 o.a.activemq.broker.TransportConnector:Connector vm://localhost已启动

这个项目仍然运作良好,只是令人讨厌。有人知道为什么会发生这种情况吗?

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

摆脱嵌入式代理不断重新启动的一种方法是在
应用程序中启用池。属性

spring.activemq.pooled=true
为了使用它,您还必须将以下依赖项添加到
pom.xml

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

org.apache.activemq

在这一页的底部写着:

使用ActiveMQConnectionFactory

代理将在创建第一个连接时创建。
...


同样,这并不能完全解释发生了什么,但当我发现启用池阻止了这种行为发生时,我停止了挖掘。

遇到了同样的问题,但公认的答案没有帮助。发现

ActiveMQ只会在内存队列中存在某些内容时使其保持活动状态

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

棍子 在SpringJMS容器(org.springframework.JMS.listener.DefaultMessageLi-stenerContainer)的bean定义中修复该问题

@Bean
公共JmsListenerContainerFactory myFactory(连接工厂连接工厂,
DefaultJmsListenerContainerFactoryConfigurer(配置器){
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();

setCacheLevelName(“CACHE_CONNECTION”);//我所做的是显式创建一个代理,并告诉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;
    }

}

接受的答案不适合我,找到了另一个解决方案。可能会有帮助:

如果您正在使用Spring Boot应用程序,并且不需要PooledConnectionFactory,则将此行添加到应用程序类中:

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

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

我们有spring boot 1.5服务,它通过JMSTemplate消费和发布,没有这个问题,然后我们有一个只发布(因此没有JmsListener)使用这些消息填充日志-加上相关的警告>代码>临时存储限制为51200 MB…重置为最大可用磁盘空间 >在每个GET/HealthCheg上写入它们。
management.health.jms.enabled=false

因此,您将看到
jms
块从
/healthcheck
输出中消失,因此请检查它是否实际反映了服务所需的任何内容。
我们在这个线程上的其他答案和我们尝试过的答案都没有成功。

你太棒了,我太感谢你了,这已经困扰了我好几个星期了。非常感谢你使用这种方法,有一个Spring启动问题。activemq池依赖项将添加到你的类路径Geronimo JTA事务管理器中,Spring启动将比默认情况下使用JTA事务。但分布式事务是众所周知的性能杀手。因此,您可能不希望在应用程序中使用它。最新版本的spring boot需要属性
spring.activemq.pool.enabled=true
它与运行状况检查相关(在我的例子中是
/exactor/health
)对我来说,照你说的做就可以停止留言。
@SpringBootApplication(exclude = {ActiveMQAutoConfiguration.class})
public class MyApplication{...}