| package com.zy.core.netty.handle; | 
|   | 
| import com.core.common.Cools; | 
| import com.zy.core.netty.AbstractInboundHandler; | 
| import com.zy.core.netty.cache.ChannelCache; | 
| import com.zy.core.netty.constant.Constant; | 
| import com.zy.core.netty.domain.ChPackage; | 
| import io.netty.channel.ChannelHandler; | 
| import io.netty.channel.ChannelHandlerContext; | 
| import io.netty.handler.timeout.IdleState; | 
| import io.netty.handler.timeout.IdleStateEvent; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.springframework.stereotype.Component; | 
|   | 
| /** | 
|  * 通道维护handler | 
|  * Created by vincent on 2019-04-11 | 
|  */ | 
| @Slf4j | 
| @Component("protectorHandler") | 
| @ChannelHandler.Sharable | 
| public class ProtectorHandler extends AbstractInboundHandler<ChPackage> { | 
|   | 
|     @Override | 
|     protected boolean channelRead0(ChannelHandlerContext ctx, ChPackage pac) throws Exception { | 
|         // jvm堆外内存需要手动释放 | 
| //        ReferenceCountUtil.release(pac.getSourceBuff()); | 
|         return true; | 
|     } | 
|   | 
|     /** | 
|      * 空闲剔除 | 
|      */ | 
|     @Override | 
|     public void userEventTriggered(ChannelHandlerContext ctx, Object evt) { | 
|         if (evt instanceof IdleStateEvent) { | 
|             IdleStateEvent e = (IdleStateEvent) evt; | 
|             if (IdleState.READER_IDLE == e.state()) { | 
|                 String uuid = ChannelCache.removeChannel(ctx.channel()); | 
|                 ctx.close(); | 
|                 if (!Cools.isEmpty(uuid)){ | 
|                     log.info("uuid={} 空闲剔除", uuid); | 
|                     Constant.errorMap.put(Integer.parseInt(uuid), "断开异常"); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 断开连接 | 
|      */ | 
|     @Override | 
|     public void channelInactive(ChannelHandlerContext ctx) { | 
|         String uuid = ChannelCache.removeChannel(ctx.channel()); | 
|         ctx.close(); | 
|         if (!Cools.isEmpty(uuid)){ | 
|             log.info("通道 uuid={} 失去连接", uuid); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 管道异常 | 
|      */ | 
|     @Override | 
|     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { | 
|         cause.printStackTrace(); | 
| //        ChannelCache.removeChannel(ctx.channel()); | 
| //        ctx.close(); | 
|     } | 
|   | 
| } |