mina 当一端关闭时,IoHandlerAdapter只会调用sessionClosed,即使调用
IoSessionConfig SessionConfig = connector.getSessionConfig();
SessionConfig.setIdleTime(IdleStatus.READER_IDLE,
10);// 10秒没有任何读信息
也不会因为空闲很久调用sessionIdle;
public class SocketHandler extends IoHandlerAdapter {
protected final Logger log = Logger.getLogger(getClass());
private NodeInfo nodeInfo;
private boolean isWorkConnect;
public SocketHandler(NodeInfo nodeInfo, boolean isWorkConnect) {
this.nodeInfo = nodeInfo;
this.isWorkConnect = isWorkConnect;
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
log.info(nodeInfo.getId() + (String) message);
new ResultReg().checkResult(nodeInfo.getId(), (String) message,
isWorkConnect);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
log.error("异常");
cause.printStackTrace();
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
// log.info("发送消息" + message);
}
/**
* 这个方法解决了人工误操作关闭接点的问题,mina在处理一个连接时,当一个连接的节点关闭后会自动调用此方法,而不是sessionIdle方法。
* sessionIdle只会处理节点正常开启状况下长时间没有读信息才会被调用,这里不适用,所以sessionIdle方法根本没有任务意义
*/
@Override
public void sessionClosed(IoSession session) throws Exception {
log.error("节点异常关闭" + nodeInfo.getId());
nodeInfo.shutdown();
}
@Override
public void sessionCreated(IoSession session) throws Exception {
}
@Override
public void sessionOpened(IoSession session) throws Exception {
log.info(nodeInfo.getId() + "session打开");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
log.error("节点正常开启却没有呼吸" + nodeInfo.getId());
nodeInfo.shutdown();
}