`
zhaoningbo
  • 浏览: 620452 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Zeroc Ice中间件之通讯器资源回收

阅读更多

引言:

 

    一个类的方法非常多,且被调用较多时,就不宜采用“单方法单代理”的方式了来调用远程ICE服务了。其本质原因是,客户端每次申请新代理都会占用本机的一个端口。如果“单方法单代理”遭遇峰值,可能会直接导致本机端口原因引发异常。异常内容如下:

41:30,031:[CCX_S_FA_INVESTINCOME]002143
Exception in thread "main" Ice.SyscallException
    error = 0
	at IceInternal.Selector.<init>(Selector.java:29)
	at IceInternal.ThreadPool.<init>(ThreadPool.java:77)
	at IceInternal.Instance.finishSetup(Instance.java:786)
	at Ice.CommunicatorI.finishSetup(CommunicatorI.java:286)
	at Ice.Util.initialize(Util.java:212)
	at Ice.Util.initialize(Util.java:222)
	at com.ccx.stock.financialAnalysisNew.DerRepoDataClient.getOwnPrx(DerRepoDataClient.java:83)
	at com.ccx.stock.financialAnalysisNew.DerRepoDataClient.CCX_S_FA_INVESTINCOME(DerRepoDataClient.java:204)
	at com.ccx.stock.financialAnalysisNew.TestDerRepoDataClient.main(TestDerRepoDataClient.java:44)
Caused by: java.io.IOException: Unable to establish loopback connection
	at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:106)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.nio.ch.PipeImpl.<init>(PipeImpl.java:122)
	at sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:27)
	at java.nio.channels.Pipe.open(Pipe.java:133)
	at sun.nio.ch.WindowsSelectorImpl.<init>(WindowsSelectorImpl.java:104)
	at sun.nio.ch.WindowsSelectorProvider.openSelector(WindowsSelectorProvider.java:26)
	at java.nio.channels.Selector.open(Selector.java:209)
	at IceInternal.Selector.<init>(Selector.java:25)
	... 8 more
Caused by: java.net.BindException: Address already in use: connect
	at sun.nio.ch.Net.connect(Native Method)
	at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:507)
	at java.nio.channels.SocketChannel.open(SocketChannel.java:146)
	at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:78)
	... 16 more

 

    下文将对此问题做以简单介绍。

 

正文:

 

    (晚点续上)

 

     (续上)
 
1,首先有以下几个要点需要说明。


    A)项目中ICE通讯使用的是默认TPC/IP(socket)通讯;
    B)Java1.4后以NIO升级老版IO(以支持多路复用);
    C)请求发出后,返回之前,请求者需要被阻塞(java Object.wait()等及线程机制的需要);

2,接下来说说引言中提到的报错信息。


    第2行:Ice.SyscallException,ICE骨架支持异常。

    第13行:Unable to establish loopback connection,本机对本机的连接不能持久化。

    第24行BindException: Address already in use: connect,地址已经被占用。

 

3,详细分析。

 

    本例异常,引发的根本原因是13行与24行。

 

    24行的异常。主要是由于Java每个socket请求时,都会占用*至少*一个端口,本例测试时循环5000个socket请求,在400左右时便出现上述异常。其原因就在当前请求的socket端口已被之前的socket占有。关于此异常很常见,随便搜索一下,可以看到大量的说明,因此这里跳过。

 

    13行的异常。也是本例异常产生的重点。

 

    loopback connection,这是什么connection呢?!是形如如下的connection:

  TCP    10.0.2.128:3024        10.0.2.128:3046      ESTABLISHED
  TCP    10.0.2.128:3046        10.0.2.128:3024      ESTABLISHED

    这两行TCP连接互相监听,组成一对“loopback connection”。初看此连接觉得很费解,为什么会出现这样的TCP(socket)连接呢?回想一下正文第1节C中提到的“阻塞-唤醒”这一需要。我们假设有一个名A的socket请求发出后,很自然进入阻塞状态,随后服务者B在处理结束(正常、异常、强制),想以更效率的DI(Donot call me, I'll call U.)方式唤醒请求者A进行后续处理。

 

    这时就遇到一个问题DI的唤醒如何实现。可能的方式有三:一是B处理结束后有数据需要处理或发生异常;二是超时timeout;三是强制方式(如Executors强制限时完成等)。一看就只有第一种方式了。让自己的3024监听自己的3046,如果自己的socket请求正常调用就不说了;非正常情况下,只要把异常处理或者超时处理交给3046来处理并返回给3024,通知失败(有返回数据需要处理时可被自动唤配),随后自己即可被唤醒了。

 

    这样也就解释了为什么会有loopback connection异常发生。

 

    另外,需要说明的是ICE穿墙采用的是“双向连接”方式,每个客户端请求可能需要使用不止一两个端口。因此在客户端编写并发、单请求单通路,这类socket短时峰值较高的代码时,应该尽力避免。

 

总结:

 

    1,由于java socket连接本身存在“对端口资源的消耗性 与 端口资源的有限性”这一问题,加之ICE默认TCP双向连接的特点更加强了消耗性影响,因此在使用ICE创建通讯器请求远程代理时,尽可能加强代理“复用性”,减少“回收与重申请”。

 

    2,ICE是主要是用于企业架构的,而非通信的。如果不是为架构而来,建议可以考虑一下mina——更专业的java通信框架。

 

尾声:

 

    因为笔者是C/C++,Java双修,双“半吊子”,对socket的理解,欢迎大家批评、讨论。

 

(完)

 

 

 

1
0
分享到:
评论

相关推荐

    Zero Ice中文教程

    **零冰(Zero Ice)教程概述** Zero Ice是一款强大的分布式框架,它允许开发者构建高度可扩展的、跨语言的应用程序。这个"Zero Ice中文教程"是针对中国开发者设计的,旨在帮助他们理解和应用Ice框架,克服语言障碍,...

    基于ICE中间件实现的传文件

    本篇文章将详细探讨如何基于ICE中间件实现文件传输功能。 首先,我们要理解ICE的核心概念。ICE支持多种编程语言,如C++、Java、Python等,它提供了一种透明的接口,让开发者可以在不同的网络节点之间进行对象交互,...

    zero ICE快速入门java版

    zero ICE快速入门文档, ice是最优秀的rpc框架。 4、开发服务端代码如下 步骤一:编写Servant类即带有Disp的存根文件也就是说继承_HelloWorldDisp 这个类,这个类是个抽象类定义如下: public abstract class _...

    Zero ICE 3.5.1 jar

    远程调用框架 Zero ICE 3.5.1 jar

    Zero Ice 3.6源码

    在深入探讨Zero Ice 3.6的知识点之前,我们先了解一下什么是中间件以及它在软件开发中的作用。 中间件是一种位于操作系统和应用程序之间的软件,它为开发者提供了构建分布式应用的标准化环境。通过中间件,不同应用...

    ICE客户端与服务端通信Demo

    平台编译环境:VS2017 ICE版本:3.7.7 ICEbuilder:5.0.9 源码中有两套程序: Server:启动服务器,等待连接 。连接后可双方通信 Client:连接服务器,与服务器通讯。 Slice: 手写几个接口即可。

    zeroc ice教程 ice环境配置 Ice中文教程 C++ ICE java ICE ICE入门 ice基础教程 ice开发文档

    Zeroc ICE是一个开源的中间件平台,它支持C++、Java、Python、.NET等语言的分布式对象通信。ICE全称Internet Communications Engine,即互联网通信引擎,是一种用于开发分布式计算应用的强大工具。本文档主要围绕ICE...

    ZeroMQ 消息通讯中间件库

    ZeroMQ,又称为0MQ或ZMQ,是一个高效的消息通讯中间件库,它允许程序员创建分布式多线程、跨平台的应用程序。这个库被设计成轻量级且易于嵌入到现有的应用程序中,同时提供了丰富的API接口,适用于多种编程语言,如C...

    Ice zero分布式程序设计2分

    《Ice Zero分布式程序设计》是关于使用Ice Zero框架进行分布式应用程序开发的专业资料。Ice Zero是Objectice Software公司推出的轻量级、高性能的RPC(远程过程调用)框架,它为开发者提供了一种简单、高效的方式来...

    Ice 分布式程序设计 中文PDF版_C++_Zero_

    ZERO-ICE是一个强大的、面向对象的、基于组件的中间件,它允许程序员在多种语言之间创建无缝的、高性能的网络应用程序,而无需关心底层的通信细节。本书主要涵盖了以下核心知识点: 1. **ICE简介**:ICE是一种跨...

    ice_3.7.0_linux版

    Zero ICE,Zeroc ICE,ice,linux,2017年最新版的Zero ICE版本3.7.0,linux版本 Zero ICE,Zeroc ICE,ice,linux,2017年最新版的Zero ICE版本3.7.0,linux版本

    Ice通信框架原理与实践

    《Ice通信框架原理与实践》是一份深度探讨Ice框架的宝贵资源,对于初学者和有经验的开发者来说都是绝佳的学习材料。Ice,全称为“Internet Communication Engine”,是一种高性能、跨平台的分布式对象中间件,它提供...

    ZeroC Ice 3.7.3 源码与中文教程.rar

    Ice 是一种面向对象的中间件平台。从根本上说,这意味着 Ice 为构建面 向对象的客户-服务器应用提供了工具、 API 和库支持。 Ice 应用适合在异 种环境中使用:客户和服务器可以用不同的编程语言编写,可以运行在不 ...

    Zero ICE 中文文档

    一种支持 C++ java语言的Client /server 服务方式中文文档。。

    ZeroC ICE 简单介绍及代码

    介绍ICE互联网通讯引擎是什么,以及其工作原理。附有简单的源代码,可以实现测试使用。

    ice培训(服务、接口)ppt

    Zero Ice是一个面向对象的中间件平台,支持跨语言、跨平台的客户-服务器应用开发。它提供了工具、库和API,允许在不同的编程语言、操作系统和网络技术中进行通信。ICE的关键术语包括客户和服务器、ICE对象、代理...

    Ubuntu-zeroc-ice 环境安装

    在Ubuntu系统上安装Zeroc-ICE环境主要涉及以下知识点: 1. Ubuntu虚拟机的安装:用户需要在计算机上安装一个虚拟机软件,比如VirtualBox或者VMware,然后在虚拟机中安装Ubuntu操作系统。这一步骤是为了创建一个独立...

    Ice 3.4.1 在ARM上移植, 源代码补丁

    ICE 3.4.1 在移植到ARM Linux中时,double型的数据会有错误。见我在ZeroC发的帖子: http://www.zeroc.com/forums/bug-reports/5308-double-data-format-arm-linux-not-correct.html 在移植前,需要对源代码进行一些...

Global site tag (gtag.js) - Google Analytics