@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { //心跳配置 if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state() == IdleState.READER_IDLE) { SpringBeanUtils.getInstance().getBean(NettyClientService.class).doConnect(); } else if (event.state() == IdleState.WRITER_IDLE) { //表示已经多久没有发送数据了 HEART_BEAT.setAction(NettyMessageActionEnum.HEART.getCode()); ctx.writeAndFlush(HEART_BEAT); LogUtil.debug(LOGGER, () -> "向服务端发送的心跳"); } else if (event.state() == IdleState.ALL_IDLE) { //表示已经多久既没有收到也没有发送数据了 SpringBeanUtils.getInstance().getBean(NettyClientService.class).doConnect(); } } }
/** * 内部链路检测 * @param ctx * @param evt * @throws Exception */ @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { //当通道空闲时由IdleStateHandler触发的用户事件 if (evt instanceof IdleStateEvent){ IdleStateEvent event = (IdleStateEvent) evt; // 判断Channel是否读空闲, 读空闲时移除Channel if (event.state().equals(IdleState.READER_IDLE)) { final String address = NettyUtil.parseChannelRemoteAddr(ctx.channel()); logger.warn("Netty Server UserAuthHandler: IDLE exception :{}", address); manager.removeChannel(ctx.channel()); //广播用户数量 manager.broadMessage(QuarkChatProtocol.buildSysUserInfo(manager.getUsers())); } } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { //心跳配置 if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state() == IdleState.READER_IDLE) { //表示已经多久没有收到数据了 //ctx.close(); } else if (event.state() == IdleState.WRITER_IDLE) { //表示已经多久没有发送数据了 SocketUtils.sendMsg(ctx, heartJson); logger.info("心跳数据---" + heartJson); } else if (event.state() == IdleState.ALL_IDLE) { //表示已经多久既没有收到也没有发送数据了 } } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state().equals(IdleState.ALL_IDLE)) { final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(ctx.channel()); log.warn("NETTY CLIENT PIPELINE: IDLE exception [{}]", remoteAddress); closeChannel(ctx.channel()); if (NettyRemotingClient.this.channelEventListener != null) { NettyRemotingClient.this .putNettyEvent(new NettyEvent(NettyEventType.IDLE, remoteAddress, ctx.channel())); } } } ctx.fireUserEventTriggered(evt); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { /** *IdleStateEvent事件,在指定时间没有进行读写,会进行回调 */ IdleStateEvent event = (IdleStateEvent) evt; if (event.state().equals(IdleState.ALL_IDLE)) { final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(ctx.channel()); log.warn("NETTY SERVER PIPELINE: IDLE exception [{}]", remoteAddress); RemotingUtil.closeChannel(ctx.channel()); //关闭channel if (NettyRemotingServer.this.channelEventListener != null) { NettyRemotingServer.this .putNettyEvent(new NettyEvent(NettyEventType.IDLE, remoteAddress, ctx.channel())); } } } ctx.fireUserEventTriggered(evt); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { Channel channel = ctx.channel(); if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state() == IdleState.ALL_IDLE) { //发送心跳 channel.writeAndFlush(PING); } if (event.state() == IdleState.READER_IDLE) { //发送心跳 channel.writeAndFlush(PING); } if (event.state() == IdleState.WRITER_IDLE) { channel.writeAndFlush(PING); } } else { super.userEventTriggered(ctx, evt); } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { Channel channel = ctx.channel(); dataCenterChannelStore.isDcChannelToSave(channel); if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state() == IdleState.ALL_IDLE) { //发送心跳 channel.writeAndFlush(PING); } if (event.state() == IdleState.READER_IDLE) { //发送心跳 channel.writeAndFlush(PING); } if (event.state() == IdleState.WRITER_IDLE) { channel.writeAndFlush(PING); } } else { super.userEventTriggered(ctx, evt); } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state() == IdleState.READER_IDLE) { ctx.writeAndFlush(PING); } if (event.state() == IdleState.WRITER_IDLE) { ctx.writeAndFlush(PING); } if (event.state() == IdleState.ALL_IDLE) { ctx.writeAndFlush(PING); } } else { super.userEventTriggered(ctx, evt); } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent evnet = (IdleStateEvent) evt; if (evnet.state().equals(IdleState.ALL_IDLE)) { final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(ctx.channel()); log.warn("NETTY CLIENT PIPELINE: IDLE exception [{}]", remoteAddress); closeChannel(ctx.channel()); if (NettyRemotingClient.this.channelEventListener != null) { NettyRemotingClient.this.putNettyEvent(new NettyEvent(NettyEventType.IDLE, remoteAddress.toString(), ctx.channel())); } } } ctx.fireUserEventTriggered(evt); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent evnet = (IdleStateEvent) evt; if (evnet.state().equals(IdleState.ALL_IDLE)) { final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(ctx.channel()); log.warn("NETTY SERVER PIPELINE: IDLE exception [{}]", remoteAddress); RemotingUtil.closeChannel(ctx.channel()); if (NettyRemotingServer.this.channelEventListener != null) { NettyRemotingServer.this .putNettyEvent(new NettyEvent(NettyEventType.IDLE, remoteAddress.toString(), ctx.channel())); } } } ctx.fireUserEventTriggered(evt); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent evnet = (IdleStateEvent) evt; if (evnet.state().equals(IdleState.ALL_IDLE)) { final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(ctx.channel()); log.warn("NETTY CLIENT PIPELINE: IDLE exception [{}]", remoteAddress); closeChannel(ctx.channel()); if (NettyRemotingClient.this.channelEventListener != null) { NettyRemotingClient.this .putNettyEvent(new NettyEvent(NettyEventType.IDLE, remoteAddress.toString(), ctx.channel())); } } } ctx.fireUserEventTriggered(evt); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent evnet = (IdleStateEvent) evt; // 判断Channel是否读空闲, 读空闲时移除Channel if (evnet.state().equals(IdleState.READER_IDLE)) { final String remoteAddress = NettyUtil.parseChannelRemoteAddr(ctx.channel()); logger.warn("NETTY SERVER PIPELINE: IDLE exception [{}]", remoteAddress); UserInfoManager.removeChannel(ctx.channel()); UserInfoManager.broadCastInfo(ChatCode.SYS_USER_COUNT,UserInfoManager.getAuthUserCount()); } } ctx.fireUserEventTriggered(evt); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent idle = (IdleStateEvent) evt; if (idle.state() == IdleState.READER_IDLE) { // We have not read any data from client in a while, let's close // the subscriptions for this context. LOG.info("Client {} is idle", ctx.channel()); } } else if (evt instanceof SslCompletionEvent) { SslCompletionEvent ssl = (SslCompletionEvent) evt; if (!ssl.isSuccess()) { LOG.error("SSL error: {}", ssl.getClass().getSimpleName(), ssl.cause()); } } else { LOG.warn("Received unhandled user event {}", evt); } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { //心跳配置 if (IdleStateEvent.class.isAssignableFrom(evt.getClass())&& socketService.getSocketEventService().hasOpenHeartCheck()) { IdleStateEvent event = (IdleStateEvent) evt; String uniqueKey = ctx.channel().remoteAddress().toString(); if (event.state() == IdleState.READER_IDLE) { //表示已经多久没有收到数据了 socketService.getSocketEventService().onHeartNoReadDataListener(ctx,uniqueKey); } else if (event.state() == IdleState.WRITER_IDLE) { //表示已经多久没有发送数据了 socketService.getSocketEventService().onHeartNoWriteDataListener(ctx,uniqueKey); } else if (event.state() == IdleState.ALL_IDLE) { //表示已经多久既没有收到也没有发送数据了 } } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state().equals(IdleState.ALL_IDLE)) { final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(ctx.channel()); log.warn("NETTY CLIENT PIPELINE: IDLE exception [{}]", remoteAddress); closeChannel(ctx.channel()); if (NettyRemotingClient.this.channelEventListener != null) { NettyRemotingClient.this .putNettyEvent(new NettyEvent(NettyEventType.IDLE, remoteAddress.toString(), ctx.channel())); } } } ctx.fireUserEventTriggered(evt); }
/** * 利用事件变化来做心跳检测 */ @Override public void userEventTriggered( ChannelHandlerContext _ctx , Object _obj ) throws Exception { logger.debug( _handler_info( _ctx , "userEventTriggered" ) ); if ( _obj instanceof IdleStateEvent ) { IdleStateEvent event = ( IdleStateEvent ) _obj; if ( event.state() == IdleState.READER_IDLE ) { lost++; logger.debug( _handler_info( _ctx , " inactive with=" + lost ) ); if ( lost > 2 ) { handler.stand( _ctx ); logger.debug( _handler_info( _ctx , " was stand with=" + lost ) ); } } } else { logger.warn( _handler_info( _ctx , " was discard" ) ); } }
@Override public void userEventTriggered(final ChannelHandlerContext ctx, Object evt) throws Exception { if(evt instanceof IdleStateEvent) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state() == IdleState.READER_IDLE) { System.out.println("--- Reader Idle ---"); ctx.writeAndFlush("读取等待:客户端你在吗... ...\r\n"); } else if (event.state() == IdleState.WRITER_IDLE) { System.out.println("--- Write Idle ---"); ctx.writeAndFlush("写入等待:客户端你在吗... ...\r\n"); } else if (event.state() == IdleState.ALL_IDLE) { System.out.println("--- All_IDLE ---"); ctx.writeAndFlush("全部时间:客户端你在吗... ...\r\n"); } }else{ super.userEventTriggered(ctx, evt); } }
/** * 判断是否是IdleStateEvent事件,是则处理 */ @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if(evt instanceof IdleStateEvent) { IdleStateEvent event = (IdleStateEvent) evt; String type = ""; if(event.state() == IdleState.READER_IDLE) type = "read idle"; else if(event.state() == IdleState.WRITER_IDLE) type = "write idle"; else if(event.state() == IdleState.ALL_IDLE) type = "all idle"; // ChannelFuture f = ctx.writeAndFlush(HEARTBEAT_SEQUENCE.duplicate()); f.addListener(ChannelFutureListener.CLOSE_ON_FAILURE); System.out.println(ctx.channel().remoteAddress() + "超时类型 : " + type); } else { super.userEventTriggered(ctx, evt); } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent idle = (IdleStateEvent) evt; if (idle.state() == IdleState.READER_IDLE) { // We have not read any data from client in a while, let's close // the subscriptions for this context. String subscriptionId = ctx.channel().attr(SubscriptionRegistry.SUBSCRIPTION_ID_ATTR).get(); if (!StringUtils.isEmpty(subscriptionId)) { if (SubscriptionRegistry.get().containsKey(subscriptionId)) { LOG.info("Closing subscription with subscription id {} due to idle event", subscriptionId); SubscriptionRegistry.get().get(subscriptionId).close(); } } else { LOG.warn("Channel idle, but no subscription id found on context. Unable to close subscriptions"); } } } else if (evt instanceof SslCompletionEvent) { SslCompletionEvent ssl = (SslCompletionEvent) evt; if (!ssl.isSuccess()) { LOG.error("SSL error: {}", ssl.getClass().getSimpleName(), ssl.cause()); } } else { LOG.warn("Received unhandled user event {}", evt); } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent e = (IdleStateEvent) evt; if (e.state() == IdleState.READER_IDLE) { logger.info("READER_IDLE 事件触发, 关闭连接");/*读超时*/ ctx.close(); } else if (e.state() == IdleState.WRITER_IDLE) { logger.info("WRITER_IDLE 事件触发"); ctx.writeAndFlush(new PingMessage()); } else if (e.state() == IdleState.ALL_IDLE) { logger.info("ALL_IDLE 事件触发, 关闭连接"); ctx.close(); } } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { super.userEventTriggered(ctx, evt); // 拦截链路空闲事件并处理心跳 if (evt instanceof IdleStateEvent) { // 心跳处理 IdleStateEvent event = (IdleStateEvent) evt; if (event.state().equals(IdleState.READER_IDLE)) { // 未进行读操作, 服务器端主动关闭连接 LOGGER.warn("READER_IDLE,client maybe not exist,we will close the chnnel"); if (ctx.channel().isOpen()) { ctx.close(); } ctx.close(); } else if (event.state().equals(IdleState.WRITER_IDLE)) { // 未进行写操作, nothing todo // LOGGER.info("WRITER_IDLE, long time not write something to client"); } else if (event.state().equals(IdleState.ALL_IDLE)) { // 未进行读写 // LOGGER.info("ALL_IDLE, long time not to write or read"); // 发送心跳消息 // MsgHandleService.getInstance().sendMsgUtil.sendHeartMessage(ctx); } } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent event = (IdleStateEvent) evt; com.lts.remoting.Channel channel = new NettyChannel(ctx); final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(channel); if (event.state().equals(IdleState.ALL_IDLE)) { LOGGER.warn("SERVER: IDLE [{}]", remoteAddress); RemotingHelper.closeChannel(channel); } if (channelEventListener != null) { RemotingEventType remotingEventType = RemotingEventType.valueOf(event.state().name()); putRemotingEvent(new RemotingEvent(remotingEventType, remoteAddress, channel)); } } ctx.fireUserEventTriggered(evt); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { Channel channel = ctx.channel(); log.error("userEventTriggered={}, object={}", channel, evt); if (!(evt instanceof IdleStateEvent)) { return; } if (evt instanceof IdleStateEvent) { IdleStateEvent e = (IdleStateEvent) evt; if (e.state() == IdleState.READER_IDLE) { log.debug("userEventTriggered(readIdle)={}", ctx.channel()); if (isReadBytes == false) ctx.close(); } else if (e.state() == IdleState.WRITER_IDLE) { log.debug("userEventTriggered(writeIdle)={}", ctx.channel()); if (isReadBytes == false) ctx.close(); } else { log.debug("userEventTriggered(allIdle)={}", ctx.channel()); if (isReadBytes == false) ctx.close(); } } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state().equals(IdleState.ALL_IDLE)) { final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(ctx.channel()); log.warn("NETTY SERVER PIPELINE: IDLE exception [{}]", remoteAddress); RemotingUtil.closeChannel(ctx.channel()); if (NettyRemotingServer.this.channelEventListener != null) { NettyRemotingServer.this .putNettyEvent(new NettyEvent(NettyEventType.IDLE, remoteAddress, ctx.channel())); } } } ctx.fireUserEventTriggered(evt); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state() == IdleState.READER_IDLE) { // logger.info("read idle"); } else if (event.state() == IdleState.WRITER_IDLE) { // logger.info("write idle"); } else if (event.state() == IdleState.ALL_IDLE) { JSyncPacket message = new JSyncPacket(); message.setPacketType(2); ctx.channel().writeAndFlush(message); logger.info("[Server 链路空闲!发送心跳!]" + message); } } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent evnet = (IdleStateEvent) evt; if (evnet.state().equals(IdleState.ALL_IDLE)) { final String remoteAddress = RemotingHelper.parseChannelRemoteAddr(ctx.channel()); log.warn("NETTY SERVER PIPELINE: IDLE exception [{}]", remoteAddress); RemotingUtil.closeChannel(ctx.channel()); if (NettyRemotingServer.this.channelEventListener != null) { NettyRemotingServer.this.putNettyEvent(new NettyEvent(NettyEventType.IDLE, remoteAddress.toString(), ctx.channel())); } } } ctx.fireUserEventTriggered(evt); }
/** * When a timeout occurs, notify listener and close the channel. * * @param ctx Channel context * @param evt Event * @throws Exception */ @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state() == IdleState.READER_IDLE || event.state() == IdleState.WRITER_IDLE) { if (originalChannelContext == null) { originalChannelContext = ctx; } if (ctx == originalChannelContext) { originalChannelContext.fireUserEventTriggered(evt); isIdleHandlerOfTargetChannelRemoved = true; } else { sendTimeoutError(ctx); } /*Once a timeout occurs after sending the response, close the channel, otherwise we will still be getting response data after the timeout, if backend sends data. */ if (ctx != originalChannelContext) { ctx.close(); } } } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent e = (IdleStateEvent) evt; if (e.state() == IdleState.WRITER_IDLE) { if(ctx.hasAttr(ServerConstant.SUSPECT) && ctx.attr(ServerConstant.SUSPECT).get()){ LOGGER.info("suspect {} write idle happened again and close", ctx); ctx.close(); }else{ LOGGER.info("{} write idle happened and set context suspect true", ctx); ctx.attr(ServerConstant.SUSPECT).set(true); ctx.writeAndFlush(Unpooled.wrappedBuffer(MessageFactory.createHeartbeat().toBinary())).addListener(future -> { if (!future.isSuccess()) { LOGGER.info("failed to send heartbeat to {} message, cause by {} ", ctx.channel().remoteAddress(), future.cause()); } }); } } } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent e = (IdleStateEvent) evt; if (e.state() == IdleState.READER_IDLE) { LOGGER.info("READER_IDLE"); // ctx.close(); // 断开客户端的连接 } else if (e.state() == IdleState.WRITER_IDLE) { LOGGER.info("WRITER_IDLE"); } else if (e.state() == IdleState.ALL_IDLE) { LOGGER.info("ALL_IDLE"); // ctx.close(); // 断开客户端的连接 } } super.userEventTriggered(ctx, evt); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent event = (IdleStateEvent) evt; if (event.state().equals(IdleState.READER_IDLE)) { System.out.println("READER_IDLE"); // 超时关闭channel ctx.close(); } else if (event.state().equals(IdleState.WRITER_IDLE)) { System.out.println("WRITER_IDLE"); } else if (event.state().equals(IdleState.ALL_IDLE)) { System.out.println("ALL_IDLE"); // 发送心跳 ctx.channel().writeAndFlush("ping;"); } } super.userEventTriggered(ctx, evt); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (enableMonitor && evt instanceof IdleStateEvent) { IdleStateEvent e = (IdleStateEvent) evt; if (e.state() == IdleState.READER_IDLE && !e.isFirst()) { /* trigger expired event */ LOG.info("Server has not respond " + ctx.channel()); ctx.fireUserEventTriggered(MonitorStateEvent.MONITOR_EXPIRED_STATE_EVENT); } else if (e.state() == IdleState.WRITER_IDLE) { /* send ping packet to remote server */ if(LOG.isDebugEnabled()){ LOG.debug("sending ping request " + ctx.channel()); } ctx.writeAndFlush(ping.duplicate().retain()); } } super.userEventTriggered(ctx, evt); }