FileDocCategorySizeDatePackage
Dispatcher.javaAPI DocApache log4j 1.2.153609Sat Aug 25 00:09:42 BST 2007org.apache.log4j

Dispatcher

public class Dispatcher extends Thread
Obsolete AsyncAppender dispatcher provided for compatibility only.
deprecated
Since 1.3.

Fields Summary
private BoundedFIFO
bf
private AppenderAttachableImpl
aai
private boolean
interrupted
AsyncAppender
container
Constructors Summary
Dispatcher(BoundedFIFO bf, AsyncAppender container)

param
bf
param
container
deprecated


              
      
    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 value
    this.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);
  
Methods Summary
voidclose()

    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();
      }
    }
  
public voidrun()
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.

Other approaches might yield better results.

    //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();
        }
      }

      // synchronized
      synchronized (container.aai) {
        if ((aai != null) && (event != null)) {
          aai.appendLoopOnAppenders(event);
        }
      }
    }

    // while
    // close and remove all appenders
    aai.removeAllAppenders();