【问题标题】:How to disable InactivityMonitor logs in ActiveMQ?如何在 ActiveMQ 中禁用 InactivityMonitor 日志?
【发布时间】:2018-01-26 04:42:28
【问题描述】:

我已经在我的应用程序中实现了 ActiveMQ 消息代理,但是每当我在控制台日志中连接到 ActiveMQ 服务器时,我总是会看到以下消息:

10:28:05.282 [ActiveMQ InactivityMonitor WriteCheckTimer] DEBUG o.a.a.t.AbstractInactivityMonitor - WriteChecker: 10000ms elapsed since last write check.
10:28:05.282 [ActiveMQ InactivityMonitor Worker] DEBUG o.a.a.t.AbstractInactivityMonitor - Running WriteCheck[tcp://10.211.127.203:61616]

看起来它继续轮询侦听器队列。我希望我的侦听器处于活动状态,以便每当消息进入队列时,应用程序都可以处理它。同时,我不希望这条消息堆积我的日志文件。

我的消息配置:

@Configuration
@EnableJms
@ImportResource("classpath*:beans.xml")
public class MessagingConfiguration {   

    @Autowired
    MongoCredentialEncryptor encryptor;  

    @Value("${activemq.broker.url}")
    private String BROKER_URL = "tcp://localhost:61616";

    @Value("${activemq.request.queue}")
    private String REQUEST_QUEUE = "test.request";

    @Value("${activemq.response.queue}")
    private String RESPONSE_QUEUE = "test.response";

    @Value("${activemq.borker.username}")
    private String BROKER_USERNAME = "admin";

    @Value("${activemq.borker.password}")
    private String BROKER_PASSWORD = "admin";

    @Autowired
    ListenerClass messageListener;

    @Autowired
    JmsExceptionListener jmsExceptionListener;

    @Bean
    public ActiveMQConnectionFactory connectionFactory() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL(BROKER_URL);
        connectionFactory.setUserName(BROKER_USERNAME);
        //connectionFactory.setPassword(BROKER_PASSWORD);
        connectionFactory.setPassword(encryptor.decrypt(BROKER_PASSWORD));
        connectionFactory.setTrustAllPackages(true);
        connectionFactory.setRedeliveryPolicy(redeliveryPolicy());
        return connectionFactory;
    }

    @Bean
    public RedeliveryPolicy redeliveryPolicy() {
        RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
        redeliveryPolicy.setBackOffMultiplier(3); // Wait 5 seconds first re-delivery, then 15, 45 seconds
        redeliveryPolicy.setInitialRedeliveryDelay(5000);
        redeliveryPolicy.setMaximumRedeliveries(3);
        redeliveryPolicy.setUseExponentialBackOff(true);
        return redeliveryPolicy;
    }

    @Bean
    public ConnectionFactory cachingConnectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setTargetConnectionFactory(connectionFactory());
        connectionFactory.setExceptionListener(jmsExceptionListener);
        connectionFactory.setSessionCacheSize(100);
        connectionFactory.setCacheConsumers(false);
        connectionFactory.setCacheProducers(false);
        return connectionFactory;
    }

    @Bean
    public JmsTemplate jmsTemplate() {
        JmsTemplate template = new JmsTemplate();
        template.setConnectionFactory(connectionFactory());
        template.setDefaultDestinationName(REQUEST_QUEUE);
        template.setSessionAcknowledgeModeName("CLIENT_ACKNOWLEDGE");
        template.setMessageConverter(converter());
        return template;
    }

    @Bean
    public DefaultMessageListenerContainer jmsListenerContainer() {
        DefaultMessageListenerContainer factory = new DefaultMessageListenerContainer();
        factory.setConnectionFactory(connectionFactory());
        factory.setConcurrency("1-1");
        factory.setDestinationName(RESPONSE_QUEUE);
        factory.setMessageListener(messageListener);
        factory.setExceptionListener(jmsExceptionListener);
        return factory;
    }

    @Bean
    MessageConverter converter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }

}

解决方案: 我通过点击此链接ActiveMQ InactivityMonitor 禁用 InactivityMonitor 找到了解决问题的方法。我测试了它的连接仍然存在,并且它不会继续轮询队列。但我想知道禁用 InactivityMonitor 是否有任何垮台?这个问题有没有更好的解决方案。

activemq.broker.url=failover:tcp://localhost:61616?wireFormat.maxInactivityDuration=0

【问题讨论】:

    标签: java activemq message-queue spring-jms


    【解决方案1】:

    解决方法很简单,将您的日志记录设置更改为不在调试级别写入或过滤该记录器以不处于调试级别。日志让您了解客户端成功 ping 远程代理以确保连接处于活动状态这一事实。如果您禁用监控,那么您可能会错过连接断开事件,例如半关闭套接字等。

    在生产环境中,您真的不想关闭连接检查功能,这些功能会导致您的代码错过它无法接收任何内容的事实

    配置修改示例:

    <logger name="org.apache.activemq.transport" level="WARN"/>
    

    【讨论】:

    • 我们应该对哪个文件进行以下修改。 ''
    • @Shawn 我想这可以在logback.xml 文件中完成。
    【解决方案2】:

    如果打印此日志并没有什么坏处,InactivityMonitor 只是检查代理和客户端之间的连接是否处于活动状态。

    如果它发现连接在给定时间内处于非活动状态,则InactivityMonitor 关闭客户端和代理之间的连接。

    我们可以通过在 activemq.xml 文件的 transportConnectors 部分的 tcp URL 中指定 wireFormat.maxInactivityDuration="&lt;time in ms&gt;" 来设置 InactivityMonitor 的超时时间。

    欲知详情,请访问:InactivityMonitor

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多