Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * 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;
 
Obsolete AsyncAppender dispatcher provided for compatibility only.

Deprecated:
Since 1.3.
 
 class Dispatcher extends Thread {
    

Deprecated:
 
   private AppenderAttachableImpl aai;
   private boolean interrupted = false;
   AsyncAppender container;

    

Deprecated:
Parameters:
bf
container
 
     this. = bf;
     this. = container;
     this. = 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.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 () {
        = 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 (.length() == 0) {
         .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.

Other approaches might yield better results.

 
   public void run() {
     //Category cat = Category.getInstance(Dispatcher.class.getName());
     LoggingEvent event;
 
     while (true) {
       synchronized () {
         if (.length() == 0) {
           // Exit loop if interrupted but only if the the buffer is empty.
           if () {
             //cat.info("Exiting.");
             break;
           }
 
           try {
             //LogLog.debug("Waiting for new event to dispatch.");
             .wait();
          } catch (InterruptedException e) {
            break;
          }
        }
        event = .get();
        if (.wasFull()) {
          //LogLog.debug("Notifying AsyncAppender about freed space.");
          .notify();
        }
      }
      // synchronized
      synchronized (.) {
        if (( != null) && (event != null)) {
          .appendLoopOnAppenders(event);
        }
      }
    }
    // while
    // close and remove all appenders
  }
New to GrepCode? Check out our FAQ X