我正在使用log4j AsyncAppender。我编写了自己的附加程序,以自定义记录器,如下所示。

public class MyAppender extends AppenderSkeleton {

    @Override
    public void close() {

    }


    @Override
    public boolean requiresLayout() {
        return false;
    }


    @Override
    protected void append(LoggingEvent event) {

    //Here am doing some logic which will connect database and fetch some records.
        // This process might take few seconds

    }

}


我的log4j配置:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

    <!-- Appenders -->

    <appender name="stdout" class="com.sample.MyAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %p [%c] - %m%n"/>
        </layout>
    </appender>


    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
        <param name="BufferSize" value="500"/>
        <appender-ref ref="stdout"/>
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="ASYNC" />
    </root>

</log4j:configuration>


现在一切正常。我MyAppender我将触发一个Select查询并从表中获取一些详细信息,然后使用Java Mail API发送这些详细信息。当我使用AsyncAppender时,它不会阻塞父线程,并且MyAppender逻辑是使用单独的线程异步执行的。我的问题是父线程是否在MyAppender逻辑完成之前完成了执行,是否可以保证该逻辑即使在父线程完成执行的情况下,MyAppender中的代码也将完成?

我的应用程序将部署在Tomcat上。

谢谢!

最佳答案

很好,AsyncAppender有其自己的线程来处理这种情况。附加程序不必在生成消息的线程完成之前完成。一旦您的附加程序收到消息,它就会完全位于另一个线程中。在这一点上,追加器不知道或不在乎父级。有人可能会说,这种用例是AsyncAppender类完全存在的原因。

如果愿意,可以check it out for yourself

您可以自己进行测试的一种方法是,使AsyncAppender在记录某些内容之前先睡很长时间(例如10秒)。将某些内容记录到父线程中的追加程序中,然后观察将其转到追加程序。您应该看到您的父线程“ end”(我怀疑在Tomcat中实际上只是意味着它将被回收回到池中),并且附加程序仍应执行其工作。

10-06 01:28