2013-01-17 26 views
1

我的一个Corba操作正在返回一个union类型的序列(一个二维数组)。Corba操作返回的序列大小是否有限制?

在一次测试中发现,该操作无法处理一次返回多于32 kB的数据。如果总体阵列大小超过32 kB,则客户端的响应只能正确解组达到32 kB。从那时起,它由未初始化的数据填充(最终使解组失败)。

在相同的环境中,还有其他能够返回更大尺寸数据的操作。然而,这是返回序列序列的唯一操作。

对于我应该知道的Corba中传输的序列或数据的长度是否有限制?我的环境由32位Java 6客户机(使用标准Java ORB)和64位服务器(C,具有2AB ORB实现)组成。

我试过到目前为止:在客户端和服务器端

调整了几个球性,这些措施似乎相关 - 超时设置(transport.ORBTCPReadTimeout - 超时设置为一个大的数字),GIOP设置(giop.ORBFragmentSizegiop.ORBBufferSize - 都设置为大数字)。这些设置都没有改变行为。

使用数据包嗅探器,我可以确认数据已发送到客户端。解组期间出现问题。

+1

这听起来不仅仅是一个CORBA实现中的错误,通常最大值应该是max CORBA :: ULong –

+0

谢谢,我其实也认为这可能是一个错误。客户端ORB是一个Oracle JDK ORB,因此我会尝试搜索这个已知的错误。 –

+0

您可以向公众提供一个示例,以确保您身边没有错误:) – tuergeist

回答

1

CORBA无界序列实际上有一点点 - 但还不够,你应该注意到它。

它们被编组为无符号long(或以CORBA术语,CORBA::ULong),它告诉编组引擎每个元素将在接下来的电线中出现多少次。它应该始终能够包含最多2,147,483,647个元素(即2^32,尺寸为CORBA::ULong)。这比32kb大得多,所以听起来像你的ORB有一个bug。

此外,事实上,它通过部分地填充而不是抛出CORBA::MARSHAL异常而失败,这是非常糟糕的。告诉您的ORB供应商开始测试基础知识。

+0

谢谢,我接受这个答案 - 确实看起来它是某种ORB错误。我再次调试了这个问题,并且只能确认它(我在两端添加了Corba存根中添加的日志,并且我可以看到序列化到一端的数据流与另一端的数据流读取的数据不匹配)。有趣的是,它似乎只发生在这种数据类型(联合序列序列)上。 –

相关问题