You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by ca...@apache.org on 2006/05/19 22:08:35 UTC
svn commit: r407900 -
/logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/Dispatcher.java
Author: carnold
Date: Fri May 19 13:08:34 2006
New Revision: 407900
URL: http://svn.apache.org/viewvc?rev=407900&view=rev
Log:
Bug 38982: Add non-blocking option for AsyncAppender
Added:
logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/Dispatcher.java
Added: logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/Dispatcher.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/Dispatcher.java?rev=407900&view=auto
==============================================================================
--- logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/Dispatcher.java (added)
+++ logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/Dispatcher.java Fri May 19 13:08:34 2006
@@ -0,0 +1,124 @@
+/*
+ * Copyright 1999,2005 The Apache Software Foundation.
+ *
+ * Licensed 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 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);
+ }
+
+ 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();
+ }
+ }
+
+ // synchronized
+ synchronized (container.aai) {
+ if ((aai != null) && (event != null)) {
+ aai.appendLoopOnAppenders(event);
+ }
+ }
+ }
+
+ // while
+ // close and remove all appenders
+ aai.removeAllAppenders();
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org