b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

log4j appender自定义_log4j routingappender_fileappender log4j(28)

电脑杂谈  发布时间:2017-01-30 04:04:43  来源:网络整理

20

21for (Iterator iter = discardMap.values().iterator(); iter

22.hasNext();) {

23events[index++] = ((DiscardSummary) iter.next())

24.createEvent();

25}

26buffer.clear();

27discardMap.clear();

28buffer.notifyAll();

29}

30}

31if (events != null) {

32for (int i = 0; i < events.length; i++) {

33synchronized (appenders) {

34appenders.appendLoopOnAppenders(events[i]);

35}

36}

37}

38}

39} catch (InterruptedException ex) {

40Thread.currentThread().interrupt();

41}

42 }

这里其实有一个bug,即当程序停止时只剩下discardMap中有日志信息,而buffer中没有日志信息,由于Dispatcher线程不检查discardMap中的日志信息,因而此时会导致discardMap中的日志信息丢失。即使在生成者中当buffer为空时,它也会激活buffer锁,然而即使激活后buffer本身大小还是为0,因而不会处理之后的逻辑,因而这个逻辑也处理不了该bug。

对于生产者,它首先处理当消费者线程出现异常而不活动时,此时将同步的输出日志;而后根据配置获取LoggingEvent中的数据;再获得buffer的对象锁,如果buffer还没满,则直接将LoggingEvent实例添加到buffer中,否则如果blocking设置为true,即生产者会等消费者处理完后再继续下一次接收数据。如果blocking设置为fasle或者消费者线程被打断,那么当前的LoggingEvent实例则会保存在discardMap中,因为此时buffer已满。

1 public void append(final LoggingEvent event) {

2if ((dispatcher == null) || !dispatcher.isAlive() || (bufferSize <= 0)) {

3synchronized (appenders) {

4appenders.appendLoopOnAppenders(event);

5}

6return;

7}

8event.getNDC();

9event.getThreadName();

10event.getMDCCopy();

11if (locationInfo) {

12event.getLocationInformation();

13}

14event.getRenderedMessage();

15event.getThrowableStrRep();

16synchronized (buffer) {

17while (true) {

18int previousSize = buffer.size();

19if (previousSize < bufferSize) {

20buffer.add(event);

21if (previousSize == 0) {

22buffer.notifyAll();

23}


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-29497-28.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...