超时问题

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后才能被调用,所以检测是否在线等方法无效。只能间接通过心跳检测判断服务器/客户端是否在线。
时间: 2024-10-13 12:52:04

超时问题的相关文章

select 设置发送超时发送注意事项

//设置发送超时你只发送, 并发送足够多的数据以填满发送缓冲区, 接收端一直不接收.发送端一量满发送缓冲区就会阻塞, 如果你设置了发送超时, 超时到了它就会返回发送超时了. 在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的:int nNetTimeout=1000;//1秒,//设置发送超时setsockopt(

mongo 自动创建索引导致应用连接超时

2016年10月16日一个周末的时光遇到了一个很是让人恼火的问题!tomcat总是抛出连接超时问题错误,让人甚是恼火啊!!! 报错信息如下: [2016-10-15 18:30:58] 113578459   INFO - ----- PermissionsInterceptor ----- - 登录人pin--------WUJIE 十月 15, 2016 6:30:58 下午 com.mongodb.DBApiLayer$Result killCursor 警告: can't clean 1

一段mongodb服务器读取数据超时的故事

北京时间 2016年9月25日  22:58:30 PM 近期线上生产环境mongodb的总是发现读取数据超时的问题,今天下午坐下来细细的研究了一番,大致过程如下: 业务背景 线上有一对mongodb主从的服务器,只是简单做了mongodb的主从,master - slave. 开始以为做了主从就能确保数据不丢的问题了,确实,数据没有发生丢失的问题,但是近期发现好多用户在点击某些操作要读取mongo里面的数据内容的时候,要等待很长的时间,这样的等待是叫人无法忍受的. 最开始的时候,以为做了主从,

IOS-网络(GET请求和POST请求、HTTP通信过程、请求超时、URL转码)

1 // 2 // ViewController.m 3 // IOS_0129_HTTP请求 4 // 5 // Created by ma c on 16/1/29. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "MBProgressHUD+MJ.h" 11 12 @interface ViewController

HttpClient(四)-- 使用代理IP 和 超时设置

1.代理IP的用处: 在爬取网页的时候,有的目标站点有反爬虫机制,对于频繁访问站点以及规则性访问站点的行为,会采集屏蔽IP措施.这时候,就可以使用代理IP,屏蔽一个就换一个IP. 2.代理IP分类: 代理IP的话 也分几种: 透明代理.匿名代理.混淆代理.高匿代理,一般使用高匿代理. 3.使用 RequestConfig.custom().setProxy(proxy).build() 来设置代理IP: public static void main(String[] args) throws

python 安装第三方库,超时报错--Read timed out.

Traceback (most recent call last): File "/home/xiaoduc/.pyenv/versions/3.5.0/lib/python3.5/site-packages/pip/_vendor/requests/packages/urllib3/response.py", line 228, in _error_catcher yield File "/home/xiaoduc/.pyenv/versions/3.5.0/lib/pyt

SqlServer2008 无法修改表,超时时间已到 在操作完成之前超时解决方法

在 SQL Server Management Studio 里, 通过菜单“工具-选项”打开选项对话框. 在左侧寻找“设计器-表设计器和数据库设计器”, 然后在右侧勾选“为表设计器更新重写连接字符串的超时值”, 在它下面的“事务超时时间”默认应该是 30 秒,我们应该把它改得稍微大一些.

关于微信支付预下单【统一下单】“操作超时”问题

问题描述: 在微信公众号开发中时常遇到使用微信支付的情况,之前一直注意到微信支付统一下单接口响应特别慢,经常出现"操作超时"的情况,最初为解决因操作超时使用户无法一次完成支付便用了个最多3次的递归,无法一次完成支付问题是解决了但根源问题还是存在,客户端响应还是很慢. 解决方法: 如果你用的是阿里的服务器,那无疑是DNS的问题,将服务器的DNS配置为腾讯公共DNS:119.29.29.29 ,之后的速度会提升很多! 关于微信统一下单: 请访问微信支付官方文档:https://pay.we

Linux-基础(centos6.9)-超时时间-字符集-history

配置字符集 LANG=zh_cn.utf-8 配置超时 export TMOUT=10 (10秒钟) 命令:history -d: 后跟指定行号删除命令   history -d 10 删除第十行 -c: 清除所有历史记录 export HISTSIZE = 5 (命令行)命令行历史纪录数量 export HISTFILESIZE = 5  (文件)显示历史条目数为5 ,对应文件  ~/.bash_history 永久生效:配置/etc/profile source /etc/profile  

System.net.mail 腾讯ssl发送邮件超时

我采用了.net 的自带组件 System.Web.Mail.MailMessage发送邮件,主要是在客户注册网站成功的时候发条欢迎邮件,最近邮件无法发送了,看了下腾讯smtp邮件配置,所有的邮件发送都换成ssl了,之前用的是25端口,现在换成了465或587,于是修改代码如下: MailMessage msgMail = new MailMessage("发件箱", "收件箱", "邮件标题", "邮件内容",2); Smt