Spring引导相同的代理消息重复到控制台
我现在正在做一个Spring Boot项目,在停止之前,每隔30秒,这个文本就会被打印到控制台上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
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{...}