此刻我正在开发一个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
该项目仍然可以正常工作,这很烦人。任何人都知道为什么会发生这种情况?
答案 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自动配置,你不会在日志中看到垃圾。