View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17
    18  package org.apache.log4j;
    19
    20  import org.apache.log4j.helpers.AppenderAttachableImpl;
    21  import org.apache.log4j.spi.LoggingEvent;
    22
    23
    24  /**
    25   * Obsolete AsyncAppender dispatcher provided for compatibility only.
    26   *
    27   * @deprecated Since 1.3.
    28   */
    29  class Dispatcher extends Thread {
    30      /**
    31       * @deprecated
    32       */
    33    private org.apache.log4j.helpers.BoundedFIFO bf;
    34    private AppenderAttachableImpl aai;
    35    private boolean interrupted = false;
    36    AsyncAppender container;
    37
    38      /**
    39       *
    40       * @param bf
    41       * @param container
    42       * @deprecated
    43       */
    44    Dispatcher(org.apache.log4j.helpers.BoundedFIFO bf, AsyncAppender container) {
    45      this.bf = bf;
    46      this.container = container;
    47      this.aai = container.aai;
    48
    49      // It is the user's responsibility to close appenders before
    50      // exiting.
    51      this.setDaemon(true);
    52
    53      // set the dispatcher priority to lowest possible value
    54      this.setPriority(Thread.MIN_PRIORITY);
    55      this.setName("Dispatcher-" + getName());
    56
    57      // set the dispatcher priority to MIN_PRIORITY plus or minus 2
    58      // depending on the direction of MIN to MAX_PRIORITY.
    59      //+ (Thread.MAX_PRIORITY > Thread.MIN_PRIORITY ? 1 : -1)*2);
    60    }
    61
    62    void close() {
    63      synchronized (bf) {
    64        interrupted = true;
    65
    66        // We have a waiting dispacther if and only if bf.length is
    67        // zero.  In that case, we need to give it a death kiss.
    68        if (bf.length() == 0) {
    69          bf.notify();
    70        }
    71      }
    72    }
    73
    74    /**
    75     * The dispatching strategy is to wait until there are events in the buffer
    76     * to process. After having processed an event, we release the monitor
    77     * (variable bf) so that new events can be placed in the buffer, instead of
    78     * keeping the monitor and processing the remaining events in the buffer.
    79     *
    80     * <p>
    81     * Other approaches might yield better results.
    82     * </p>
    83     */
    84    public void run() {
    85      //Category cat = Category.getInstance(Dispatcher.class.getName());
    86      LoggingEvent event;
    87
    88      while (true) {
    89        synchronized (bf) {
    90          if (bf.length() == 0) {
    91            // Exit loop if interrupted but only if the the buffer is empty.
    92            if (interrupted) {
    93              //cat.info("Exiting.");
    94              break;
    95            }
    96
    97            try {
    98              //LogLog.debug("Waiting for new event to dispatch.");
    99              bf.wait();
    100           } catch (InterruptedException e) {
    101             break;
    102           }
    103         }
    104
    105         event = bf.get();
    106
    107         if (bf.wasFull()) {
    108           //LogLog.debug("Notifying AsyncAppender about freed space.");
    109           bf.notify();
    110         }
    111       }
    112
    113       // synchronized
    114       synchronized (container.aai) {
    115         if ((aai != null) && (event != null)) {
    116           aai.appendLoopOnAppenders(event);
    117         }
    118       }
    119     }
    120
    121     // while
    122     // close and remove all appenders
    123     aai.removeAllAppenders();
    124   }
    125 }