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(""));
}
}
すべて正常に実行されますが、メインのすべてのステートメントが実行された後でも、このアプリケーションは終了しません。
いくつか突っついた後、メインスレッドが終了した後、ActiveMQ Transport と DestroyJavaVM の 2 つの非デーモンスレッドがアクティブになっていることに気付きました。この DestoryJavaVM スレッドは、メインスレッドが終了した後に発生したと思います。
これは、セッション/接続が閉じないことに関係していると思います。ブローカーを終了すると、アプリも終了します。
stop()
JMSQueueAppender にはセッションを閉じるメソッドがありますが、stop
呼び出されていないようです。他のアペンダーに対してもメソッドが呼び出されていないようです - RollingFileAppender で試しました。
HornetQ で同じセットアップを試しましたが、正常に動作しますが、activeMQ では動作しません
私はslf4j 1.6.4、logback 1.0.0、およびactivemq 5.5.0を使用しています
ログバックの設定はこちら
<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>
とポン
<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>
このセットアップの何が問題なのか、誰でも指摘できますか。前もって感謝します