簡體   English   中英

如何在 ActiveMQ 中禁用 InactivityMonitor 日志?

[英]How to disable InactivityMonitor logs in ActiveMQ?

我已經在我的應用程序中實現了 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

修復方法很簡單,將您的日志記錄設置更改為不在調試級別寫入,或者將某個記錄器過濾為不在調試級別。 日志讓您了解客戶端成功 ping 遠程代理以確保連接有效的事實。 如果您禁用監控,那么您可能會錯過連接丟棄事件,例如半關閉的套接字等。

在生產中,您真的不想關閉連接檢查功能,這會導致您的代碼錯過它無法接收任何內容的事實

示例配置修改:

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

如果打印此日志沒有任何害處, InactivityMonitor只是檢查代理和客戶端之間的連接是否處於活動狀態。

如果發現連接在給定時間內處於非活動狀態,則InactivityMonitor關閉客戶端和代理之間的連接。

我們可以通過在 activemq.xml 文件的 transportConnectors 部分的 tcp URL 中指定wireFormat.maxInactivityDuration="<time in ms>"來設置InactivityMonitor的超時wireFormat.maxInactivityDuration="<time in ms>"

有關詳細信息,請訪問: InactivityMonitor

謝謝蒂姆的建議。 我將此日志記錄移至WARN級別。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM