1 8 package org.jivesoftware.util.log.output; 9 10 import org.jivesoftware.util.log.ErrorAware; 11 import org.jivesoftware.util.log.ErrorHandler; 12 import org.jivesoftware.util.log.LogEvent; 13 import org.jivesoftware.util.log.LogTarget; 14 import java.util.LinkedList ; 15 16 33 public class AsyncLogTarget extends AbstractTarget implements Runnable { 34 35 private final LinkedList m_list; 36 private final int m_queueSize; 37 private final LogTarget m_logTarget; 38 39 public AsyncLogTarget(final LogTarget logTarget) { 40 this(logTarget, 15); 41 } 42 43 public AsyncLogTarget(final LogTarget logTarget, final int queueSize) { 44 m_logTarget = logTarget; 45 m_list = new LinkedList (); 46 m_queueSize = queueSize; 47 open(); 48 } 49 50 55 public synchronized void setErrorHandler(final ErrorHandler errorHandler) { 56 super.setErrorHandler(errorHandler); 57 58 if (m_logTarget instanceof ErrorAware) { 59 ((ErrorAware)m_logTarget).setErrorHandler(errorHandler); 60 } 61 } 62 63 68 public void doProcessEvent(final LogEvent event) { 69 synchronized (m_list) { 70 final int size = m_list.size(); 71 while (m_queueSize <= size) { 72 try { 73 m_list.wait(); 74 } 75 catch (final InterruptedException ie) { 76 } 80 } 81 82 m_list.addFirst(event); 83 84 if (size == 0) { 85 m_list.notify(); 88 } 89 } 90 } 91 92 public void run() { 93 boolean interupted = false; 96 97 while (true) { 98 LogEvent event = null; 99 100 synchronized (m_list) { 101 while (null == event) { 102 final int size = m_list.size(); 103 104 if (size > 0) { 105 event = (LogEvent)m_list.removeLast(); 106 107 if (size == m_queueSize) { 108 m_list.notify(); 111 } 112 113 } 114 else if (interupted || Thread.interrupted()) { 115 return; 118 } 119 else { 120 try { 121 m_list.wait(); 122 } 123 catch (final InterruptedException ie) { 124 interupted = true; 127 } 128 } 129 } 130 } 131 132 133 try { 134 m_logTarget.processEvent(event); 136 } 137 catch (final Throwable throwable) { 138 getErrorHandler().error("Unknown error writing event.", throwable, event); 139 } 140 } 141 } 142 } 143 | Popular Tags |