【问题标题】:Logback JMSAppender not cleaning up connections with ActiveMQLogback JMSAppender 没有清理与 ActiveMQ 的连接
【发布时间】:2017-09-13 01:12:57
【问题描述】:

我正在尝试在 Logback 中使用 JMSAppenders。我尝试了一个简单的应用程序来做到这一点,并成功地将日志发送到 ActiveMQ 中的队列中。

package test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerTest {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger("test");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error", new Exception(""));


    }
}

一切运行良好,但即使 main 中的所有语句都已执行,此应用程序也不会终止。

经过一番摸索,我注意到在主线程结束后,有两个非守护线程处于活动状态 ActiveMQ 传输和销毁JavaVM 我相信这个DestoryJavaVM线程是在主线程退出后产生的。

我认为这与会话/连接未关闭有关。如果我终止代理,应用程序也会退出。

在 JMSQueueAppender 中有一个 stop() 方法可以关闭会话,但它似乎从未被调用过,显然 stop 方法也没有被其他附加程序调用——我在 RollingFileAppender 上尝试过。

我尝试了与 HornetQ 相同的设置,但它工作正常,但不适用于 activeMQ

我正在使用 slf4j 1.6.4、logback 1.0.0 和 activemq 5.5.0

这是logback配置

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are by default assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>


<appender name="Queue" class="ch.qos.logback.classic.net.JMSQueueAppender">
    <InitialContextFactoryName>
        org.apache.activemq.jndi.ActiveMQInitialContextFactory
    </InitialContextFactoryName>
    <ProviderURL>tcp://localhost:61616</ProviderURL>
    <QueueConnectionFactoryBindingName>
        ConnectionFactory
    </QueueConnectionFactoryBindingName>
    <QueueBindingName>dynamicQueues/MyQueue</QueueBindingName>
</appender>


<root level="debug">
    <appender-ref ref="Queue" />
    <appender-ref ref="STDOUT" />
</root>

<logger name="org.apache.activemq" additivity="false" level="DEBUG">
    <appender-ref ref="STDOUT" />
</logger>

</configuration>

和 pom

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>LoggerTest</groupId>
    <artifactId>LoggerTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.0</version>
<!--            <scope>runtime</scope> -->
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.0.0</version>
<!--            <scope>runtime</scope> -->
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
            <version>5.5.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>

谁能指出这个设置有什么问题。提前致谢

【问题讨论】:

  • 无人回答??同样的问题...

标签: java jms activemq logback


【解决方案1】:

ActiveMQ 传输在被明确关闭之前一直保持活动状态,而 LogBack 显然不会自动关闭。

可以通过以下方式触发关机:

ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
// Check for logback implementation of slf4j
if (loggerFactory instanceof LoggerContext) {
    LoggerContext context = (LoggerContext) loggerFactory;
    context.stop();
}

取自这里:Do I need to flush events when shutting down using logback?

通过 ActiveMQ 5.7.0、LogBack 1.1.2 验证

【讨论】:

    【解决方案2】:

    从 1.1.10 版本开始,当 web 应用停止或重新加载时,logback 负责停止当前的 logback-classic 上下文(以及所有附加程序)。尝试更新您的 logback 版本并检查一次。

    这是更新后的文档:https://logback.qos.ch/manual/configuration.html#webShutdownHook

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-14
      • 2012-02-23
      • 2015-07-04
      • 2014-04-16
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      相关资源
      最近更新 更多