• 超时问题


    package org.zln.netty.tout.server;
    
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelPipeline;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.handler.codec.DelimiterBasedFrameDecoder;
    import io.netty.handler.codec.Delimiters;
    import io.netty.handler.codec.string.StringDecoder;
    import io.netty.handler.codec.string.StringEncoder;
    import io.netty.handler.timeout.IdleStateHandler;
    import io.netty.handler.timeout.WriteTimeoutHandler;
    import io.netty.util.CharsetUtil;
    
    import java.util.concurrent.TimeUnit;
    
    
    /**
     * Created by sherry on 16/12/15.
     */
    public class TimeoutServerInit extends ChannelInitializer<SocketChannel> {
    
        private static final int READ_IDEL_TIME_OUT = 4; // 读超时 - 客户端连接后不写数据
        private static final int WRITE_IDEL_TIME_OUT = 1;// 写超时
        private static final int ALL_IDEL_TIME_OUT = 2; // 所有超时
    
    
    
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            pipeline.addLast("timeoutHandler",new IdleStateHandler(READ_IDEL_TIME_OUT,WRITE_IDEL_TIME_OUT, ALL_IDEL_TIME_OUT, TimeUnit.SECONDS));
    //        pipeline.addLast("readtimeout",new ReadTimeoutHandler(4));
    //        pipeline.addLast("writetimeout",new WriteTimeoutHandler(2));
            pipeline.addLast("framer", new DelimiterBasedFrameDecoder(1024, Delimiters.lineDelimiter() ));
            pipeline.addLast("decoder",new StringDecoder(CharsetUtil.UTF_8));
            pipeline.addLast("encoder",new StringEncoder(CharsetUtil.UTF_8));
            pipeline.addLast("handler",new TimeoutServerHandler());
        }
    }
    
    package org.zln.netty.tout.client;
    
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelPipeline;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.handler.codec.DelimiterBasedFrameDecoder;
    import io.netty.handler.codec.Delimiters;
    import io.netty.handler.codec.string.StringDecoder;
    import io.netty.handler.codec.string.StringEncoder;
    import io.netty.handler.timeout.IdleStateHandler;
    import io.netty.util.CharsetUtil;
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * Created by sherry on 16/12/15.
     */
    public class TimeoutClientInit extends ChannelInitializer<SocketChannel> {
    
        private static final int READ_IDEL_TIME_OUT = 10; // 读超时 - 多久没从服务器获取到返回数据
        private static final int WRITE_IDEL_TIME_OUT = 50;// 写超时 - 连接到服务器后,多久没有写数据
        private static final int ALL_IDEL_TIME_OUT = 70; // 所有超时
    
    
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            pipeline.addLast("timeoutHandler",new IdleStateHandler(READ_IDEL_TIME_OUT,WRITE_IDEL_TIME_OUT, ALL_IDEL_TIME_OUT, TimeUnit.SECONDS));
            pipeline.addLast("framer", new DelimiterBasedFrameDecoder(1024, Delimiters.lineDelimiter() ));
            pipeline.addLast("decoder",new StringDecoder(CharsetUtil.UTF_8));
            pipeline.addLast("encoder",new StringEncoder(CharsetUtil.UTF_8));
            pipeline.addLast("handler",new TimeoutClientHandler());
        }
    }
    
    上面两段代码,分别在服务端与客户端做了超时设置。
    
    目前没找到有什么方案能够直接使用Netty进行请求处理的超时设置
    甚至没有检测客户端/服务端是否在线的好的方法。一旦进行channelRead0,其他方法只有在运行完read后才能被调用,所以检测是否在线等方法无效。只能间接通过心跳检测判断服务器/客户端是否在线。
  • 相关阅读:
    配置码云git自动更新的webhook
    PHP如何像javabean一样get+字段名方式取值
    magento信用金额支付插件开发
    JAVASCRIPT localeCompare函数运用
    利用innodb_force_recovery 解决WAMP MySQL服务器无法正常启动的问题
    android回收AnimationDrawable动画的每一帧的图片资源,而释放内存
    MySQL 性能优化 30个数据库设计的最佳实践
    mydumper 快速高效备份mysql,按照表生成备份文件,快速恢复
    MySQL 5.6查询优化器新特性的“BUG” eq_range_index_dive_limit
    Mysql Innodb 引擎优化-内存、日志、IO、其他相关参数
  • 原文地址:https://www.cnblogs.com/sherrykid/p/6224583.html
Copyright © 2020-2023  润新知