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
范围不定
美食就是美食