/**
*
*/
package com.taobao.top.analysis.node.connect;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelEvent;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
import com.taobao.top.analysis.node.component.MasterNode;
import com.taobao.top.analysis.node.event.GetTaskRequestEvent;
import com.taobao.top.analysis.node.event.MasterEventCode;
import com.taobao.top.analysis.node.event.MasterNodeEvent;
import com.taobao.top.analysis.node.event.SendMonitorInfoEvent;
import com.taobao.top.analysis.node.event.SendResultsRequestEvent;
/**
* @author fangweng
* @email: fangweng@taobao.com
* 2011-12-5 上午11:44:50
*
*/
public class MasterConnectorHandler extends SimpleChannelUpstreamHandler {
private static final Log logger = LogFactory.getLog(MasterConnectorHandler.class);
MasterNode masterNode;
volatile Channel channel;
public MasterConnectorHandler(MasterNode masterNode)
{
super();
this.masterNode = masterNode;
}
@Override
public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e)
throws Exception {
channel = e.getChannel();
}
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
throws Exception {
MasterNodeEvent nodeEvent = (MasterNodeEvent)e.getMessage();
if (nodeEvent != null)
{
if (nodeEvent.getEventCode().equals(MasterEventCode.GET_TASK) ||
nodeEvent.getEventCode().equals(MasterEventCode.SEND_RESULT) || nodeEvent.getEventCode().equals(MasterEventCode.SEND_MONITOR_INFO))
{
nodeEvent.setChannel(channel);
masterNode.addEvent(nodeEvent);
} else {
if (logger.isInfoEnabled())
logger.info("receive message from slave : " + channel.getRemoteAddress() + ", squence : " + nodeEvent.getSequence());
}
if (nodeEvent.getEventCode().equals(MasterEventCode.GET_TASK)) {
//INFO信息记录M/S通信内容
if (logger.isInfoEnabled()) {
GetTaskRequestEvent requestEvent = (GetTaskRequestEvent) nodeEvent;
String jobName = requestEvent.getJobName();
int jobCount = requestEvent.getRequestJobCount();
StringBuffer stringBuffer = new StringBuffer("receive get_task event, jobName:");
if (jobName != null)
stringBuffer.append("jobName:").append(jobName).append(",");
stringBuffer.append("jobCount:").append(jobCount).append(",from:")
.append(channel.getRemoteAddress()).append(",squence:").append(nodeEvent.getSequence());
logger.info(stringBuffer.toString());
}
}
if(nodeEvent.getEventCode().equals(MasterEventCode.SEND_RESULT)) {
//INFO信息记录M/S通信内容
if(logger.isInfoEnabled()) {
SendResultsRequestEvent requestEvent = (SendResultsRequestEvent)nodeEvent;
StringBuffer stringBuffer = new StringBuffer("receive send_result event, result:{");
stringBuffer.append(requestEvent.getJobTaskResult().toString()).append("}");
stringBuffer.append("from slave:").append(channel.getRemoteAddress()).append(",squence:").append(nodeEvent.getSequence());
logger.info(stringBuffer.toString());
}
}
if(nodeEvent.getEventCode().equals(MasterEventCode.SEND_MONITOR_INFO)) {
//INFO信息记录M/S通信内容
if(logger.isInfoEnabled()) {
SendMonitorInfoEvent requestEvent = (SendMonitorInfoEvent)nodeEvent;
StringBuffer stringBuffer = new StringBuffer("receive send_monitor_info event, result:{");
stringBuffer.append(requestEvent.getSlaveMonitorInfo().toString()).append("}");
stringBuffer.append("from slave:").append(channel.getRemoteAddress()).append(",squence:").append(nodeEvent.getSequence());
logger.info(stringBuffer.toString());
}
}
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
throws Exception {
logger.error("Unexpected exception from downstream.channel:" + e.getChannel().getRemoteAddress().toString(),
e.getCause());
e.getChannel().close();
}
@Override
public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent event)
throws Exception {
if (event instanceof ChannelStateEvent)
{
logger.info(event.toString());
}
super.handleUpstream(ctx, event);
}
}