package org.infosec.ismp.syslogd;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.infosec.ismp.eventd.sender.ObjectJmsSender;
import org.infosec.ismp.model.syslog.RawSyslog;
import org.infosec.ismp.util.ThreadCategory;
import org.springside.modules.utils.SpringContextHolder;
/**
* This class encapsulates the execution context for processing syslog messsages
* received via UDP from remote agents. This is a separate event context to
* allow the event receiver to do minimum work to avoid dropping packets from
* the agents.
*
* @author <a href="mailto:weave@oculan.com">Brian Weaver </a>
* @author <a href="http://www.oculan.com">Oculan Corporation </a>
*/
final class SyslogProcessor implements Runnable {
@SuppressWarnings("unused")
private BroadcastEventProcessor m_eventReader;
/**
* The UDP receiver thread.
*/
private Thread m_context;
/**
* The stop flag
*/
private volatile boolean m_stop;
/**
* The log prefix
*/
private String m_logPrefix;
private String m_localAddr;
public static void setSyslogConfig(SyslogdConfig syslogdConfig) {
@SuppressWarnings("unused")
SyslogdConfig m_syslogdConfig = syslogdConfig;
}
SyslogProcessor() {
m_context = null;
m_stop = false;
m_logPrefix = Syslogd.LOG4J_CATEGORY;
try {
m_localAddr = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException uhE) {
ThreadCategory log = ThreadCategory.getInstance(getClass());
m_localAddr = "localhost";
log.error("Error looking up local hostname; using 'localhost'", uhE);
}
}
/**
* Returns true if the thread is still alive
*/
boolean isAlive() {
return (m_context != null && m_context.isAlive());
}
/**
* Stops the current context
*/
void stop() throws InterruptedException {
m_stop = true;
if (m_context != null) {
ThreadCategory log = ThreadCategory.getInstance(getClass());
if (log.isDebugEnabled())
log.debug("Stopping and joining thread context "
+ m_context.getName());
m_context.interrupt();
m_context.join();
log.debug("Thread context stopped and joined");
}
}
/**
* The event processing execution context.
*/
@Override
public void run() {
// The runnable context
m_context = Thread.currentThread();
// get a logger
ThreadCategory.setPrefix(m_logPrefix);
ThreadCategory log = ThreadCategory.getInstance(getClass());
boolean isTracing = log.isEnabledFor(ThreadCategory.Level.TRACE);
if (m_stop) {
if (isTracing)
log.trace("Stop flag set before thread started, exiting");
return;
} else if (isTracing)
log.trace("Thread context started");
while (!m_stop) {
RawSyslog syslog = null;
syslog = SyslogHandler.queueManager.getFromQueue();
if (syslog!=null) {
try {
if (isTracing) {
log.trace("Processing a syslog to event dispatch"
+ syslog);
// TODO 记录事件的详细信息,便于调试
}
// 送到事件中心
//EventIpcManagerFactory.getIpcManager().sendNow(event);
// 送到jms中心
// System.out.println("send jms is: "+event.getSyslog());
ObjectJmsSender sender = (ObjectJmsSender)SpringContextHolder.getBean("syslogSender");
sender.sendSerializableObject(syslog);
} catch (Throwable t) {
log.error(
"Unexpected error processing SyslogMessage - Could not send",
t);
}
}
}
}
void setLogPrefix(String prefix) {
m_logPrefix = prefix;
}
}