`
OpenMind
  • 浏览: 177119 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

netty做Pipe一端快一端慢时防止内存溢出进行的操作

阅读更多

前段时间用netty3.x做了一个pipe的功能,读的速度很快,写的速度很慢,结果读总是把内存耗光(来不及写写到pipe的另一端),后面解决了这个问题。

原来的pipe的代码:

	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {
		inboundChannel.write(e.getMessage());
	}

 inboundChannel是一个很慢的连接,而当前连接很快(messageReceived调用很频繁),inboundChannel的写缓冲区很快满了(inboundChannel.isWritable() =false),继续写很容易就OOM了,

 

修改后的代码是:

 

private Object trafficLock = new Object();
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {
		synchronized (trafficLock) {
            inboundChannel.write(e.getMessage());
            if (!inboundChannel.isWritable()) {
                e.getChannel().setReadable(false);
            }
        }
	}

	@Override
	public void channelInterestChanged(ChannelHandlerContext ctx,
			ChannelStateEvent e) throws Exception {
		synchronized (trafficLock) {
			if (e.getChannel().isWritable()) {
				inboundChannel.setReadable(true);
			}
		}
	}

 

 必须给双方的channel都添加包含上述代码的handler,才能生效;

上面的代码可以理解成:

1,如果对方channel不可写时,把当前channel的读操作禁用;

2,如果当前的channel可写了,把对方channel的读操作启用;

 

两个handler是对等的,恰好可以解决这个问题。

 

注意:两个handler必须共享锁trafficLock,具体原因,参见讨论:

http://markmail.org/message/x7jc6mqx6ripynqf

以及另外一个实例:

http://searchco.de/codesearch/view/16958454

 

0
2
分享到:
评论

相关推荐

    springboot整合 netty做心跳检测

    springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合...

    Netty 快速入门系列-源码

    Netty是一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 Netty是一个NIO客户端、服务端框架。允许快速简单的开发网络应用程序。...

    基于netty封装的快速分布式任务开发框架

    一个基于netty封装的快速分布式任务开发框架,目标:简单,简单,再简单! easynetty-demo是用spring-boot,spring-shell实现的示例

    netty-demo实例

    Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序dsf。 也就是说,Netty 是一个基于NIO的客户,服务器端编程框架...

    使用netty进行rtsp服务端开发.zip

    使用netty进行rtsp服务端开发 一个使用netty写的rtsp服务器。 目前支持H264、H265、 AAC格式的流文件上传与存储。 H264、H265、AAC格式流文件的播放

    使用netty5进行udp网络通讯

    这个小程序使用netty5进行udp网络通讯,客户端有两种,1:用netty5类库发送DatagramPacket和接收 2:直接使用DatagramSocket发送接收DatagramPacket 先运行netty_server的QuoteOfTheMomentServer, 在运行netty_...

    netty包netty包

    netty-3.2.5.Final.jar netty包

    Netty基础,用于学习Netty,参考黑马程序员的netty教程

    Netty基础,用于学习Netty,参考黑马程序员的netty教程

    高清_书签_Netty进阶之路 跟着案例学Netty.zip

    在本书中,作者将在过去几年实践中遇到的问题,以及Netty学习者咨询的相关问题,进行了归纳和总结,以问题案例做牵引,通过对案例进行剖析,讲解问题背后的原理,并结合Netty源码分析,让读者能够真正掌握Netty,在...

    Netty (netty-netty-4.0.56.Final.tar.gz)

    Netty (netty-netty-4.0.56.Final.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    Netty入门教程文档

    Netty入门教程

    netty电子书

    Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,...

    netty-netty-3.10.6.Final.tar.gz

    Netty (netty-netty-3.10.6.Final.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    Netty框架快速入门视频教程

    Netty框架快速入门视频教程,共十课。从原理到源码分析再到案例实践。

    Netty 教程 Netty权威指南

    Netty 教程 Netty权威指南 507页完整版

    Netty (netty-netty-5.0.0.Alpha2.tar.gz)

    Netty (netty-netty-5.0.0.Alpha2.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    Netty进制转换乱码问题

    在公司做项目的时候发现用Netty进行TCP/IP通信的Netty客户端接收到的数据进制乱码,经过摸索,终于成功解决了这个鸡肋的问题

    netty-all-4.1.29.Final-sources.jar 最新版netty源码

    本jar包为最新的netty-all-4.1.29c.jar 可导入直接用 Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架...

    Netty大纲-同步netty专栏

    Netty大纲-同步netty专栏

    Netty快速入门视频全套详解教程

    Netty快速入门视频全套详解教程(内附有网盘链接地址),讲的非常详细,每个知识点附有代码demo

Global site tag (gtag.js) - Google Analytics