我的Corba操作之一是返回联合类型的序列(二维数组)的序列。
在一个测试中,事实证明该操作一次不能处理超过32 kB的数据。如果整个阵列的大小超过32 kB,则只有在最大32 kB的情况下,客户端的响应才会正确解组。从那时起,它由未初始化的数据填充(最终使取消编组失败)。
在相同的环境中,还有其他一些操作可以返回更大的数据。但是,这是唯一返回序列序列的操作。
我应该知道,通常在Corba上传输的序列或数据的长度是否有限制?
我的环境由一个32位Java 6客户端(使用标准Java ORB)和一个64位服务器(C,具有2AB ORB实现)组成。
到目前为止,我已经尝试过:
调整了客户端和服务器端的几个Orb属性,这些属性似乎相关-超时设置(transport.ORBTCPReadTimeout
-超时设置为大数),GIOP设置(giop.ORBFragmentSize
,giop.ORBBufferSize
-都设置为大数)。这些设置都没有改变行为。
使用数据包嗅探器,我可以确认数据已发送到客户端。问题在拆封过程中发生。
最佳答案
CORBA无界序列实际上是有界的-但不足以引起您的注意。
它们被编组为无符号长号(或用CORBA的形式,为CORBA::ULong
),该值告诉编组引擎接下来将在线路中出现每个元素多少次。它应该始终能够包含最多2,147,483,647个元素(即2 ^ 32,CORBA::ULong
的大小)。这远远超过了32kb,所以听起来您的ORB有一个错误。
此外,通过部分填充而不是抛出CORBA::MARSHAL
异常来使其静默失败的事实非常糟糕。告诉您的ORB供应商开始测试基础知识。