gpt4 book ai didi

java - Logback JMSAppender 不清理与 ActiveMQ 的连接

转载 作者:行者123 更新时间:2023-12-02 01:30:40 25 4
gpt4 key购买 nike

我正在尝试在 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 中的所有语句都已执行,该应用程序也不会终止。

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

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

JMSQueueAppender 中有一个 stop() 方法可以关闭 session ,但它似乎从未被调用过,显然 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>

任何人都可以指出此设置有什么问题吗?提前致谢

最佳答案

ActiveMQ 传输一直保持 Activity 状态,直到显式关闭为止,而 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 进行验证

关于java - Logback JMSAppender 不清理与 ActiveMQ 的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12884668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com