package com.zy.acs.gateway.handler;
|
|
import com.zy.acs.framework.common.Cools;
|
import com.zy.acs.gateway.AbstractInboundHandler;
|
import com.zy.acs.gateway.cache.ChannelCache;
|
import com.zy.acs.gateway.domain.AgvPackage;
|
import io.netty.channel.ChannelHandler;
|
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.handler.timeout.IdleState;
|
import io.netty.handler.timeout.IdleStateEvent;
|
import io.netty.util.ReferenceCountUtil;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Component;
|
|
/**
|
* 通道维护handler
|
* Created by vincent on 2019-04-11
|
*/
|
@Component("protectorHandler")
|
@ChannelHandler.Sharable
|
public class ProtectorHandler extends AbstractInboundHandler<AgvPackage> {
|
|
private static final Logger log = LoggerFactory.getLogger(ProtectorHandler.class);
|
|
@Override
|
protected boolean channelRead0(ChannelHandlerContext ctx, AgvPackage pac) throws Exception {
|
// jvm堆外内存需要手动释放
|
ReferenceCountUtil.release(pac.getSourceBuff());
|
return true;
|
}
|
|
/**
|
* 断开连接
|
*/
|
@Override
|
public void channelInactive(ChannelHandlerContext ctx) {
|
String uniqueno = ChannelCache.removeChannel(ctx.channel());
|
ctx.close();
|
if (!Cools.isEmpty(uniqueno)){
|
log.info("Agv [{}] 失去连接", uniqueno);
|
}
|
}
|
|
/**
|
* 管道异常
|
*/
|
@Override
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
|
log.error("ProtectorHandler exceptionCaught", cause);
|
if (cause instanceof IndexOutOfBoundsException) {
|
log.error("Received malformed data, waiting for more input......");
|
} else {
|
ChannelCache.removeChannel(ctx.channel());
|
ctx.close();
|
}
|
}
|
|
/**
|
* 空闲剔除
|
*/
|
@Override
|
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
|
if (evt instanceof IdleStateEvent) {
|
IdleStateEvent e = (IdleStateEvent) evt;
|
if (IdleState.READER_IDLE == e.state()) {
|
String uniqueno = ChannelCache.removeChannel(ctx.channel());
|
ctx.close();
|
if (!Cools.isEmpty(uniqueno)){
|
log.info("Agv [{}] 空闲剔除", uniqueno);
|
}
|
}
|
}
|
}
|
|
}
|