Open Source Repository

/** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements. See the NOTICE file distributed with* this work for additional information regarding copyright ownership.* The ASF licenses this file to You under the Apache License, Version 2.0* (the "License"); you may not use this file except in compliance with* the License. You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package org.apache.log4j;import org.apache.log4j.helpers.AppenderAttachableImpl;import org.apache.log4j.spi.LoggingEvent;/*** Obsolete AsyncAppender dispatcher provided for compatibility only.** @deprecated Since 1.3.*/class Dispatcher extends Thread {/*** @deprecated*/private org.apache.log4j.helpers.BoundedFIFO bf;private AppenderAttachableImpl aai;private boolean interrupted = false;AsyncAppender container;/**** @param bf* @param container* @deprecated*/Dispatcher(org.apache.log4j.helpers.BoundedFIFO bf, AsyncAppender container) {this.bf = bf;this.container = container;this.aai = container.aai;// It is the user's responsibility to close appenders before// exiting.this.setDaemon(true);// set the dispatcher priority to lowest possible valuethis.setPriority(Thread.MIN_PRIORITY);this.setName("Dispatcher-" + getName());// set the dispatcher priority to MIN_PRIORITY plus or minus 2// depending on the direction of MIN to MAX_PRIORITY.//+ (Thread.MAX_PRIORITY > Thread.MIN_PRIORITY ? 1 : -1)*2);}void close() {synchronized (bf) {interrupted = true;// We have a waiting dispacther if and only if bf.length is// zero. In that case, we need to give it a death kiss.if (bf.length() == 0) {bf.notify();}}}/*** The dispatching strategy is to wait until there are events in the buffer* to process. After having processed an event, we release the monitor* (variable bf) so that new events can be placed in the buffer, instead of* keeping the monitor and processing the remaining events in the buffer.** <p>* Other approaches might yield better results.* </p>*/public void run() {//Category cat = Category.getInstance(Dispatcher.class.getName());LoggingEvent event;while (true) {synchronized (bf) {if (bf.length() == 0) {// Exit loop if interrupted but only if the the buffer is empty.if (interrupted) {//cat.info("Exiting.");break;}try {//LogLog.debug("Waiting for new event to dispatch.");bf.wait();} catch (InterruptedException e) {break;}}event = bf.get();if (bf.wasFull()) {//LogLog.debug("Notifying AsyncAppender about freed space.");bf.notify();}}// synchronizedsynchronized (container.aai) {if ((aai != null) && (event != null)) {aai.appendLoopOnAppenders(event);}}}// while// close and remove all appendersaai.removeAllAppenders();}}