1

私の Corba 操作の 1 つは、union 型のシーケンス (2 次元配列) のシーケンスを返します。

テストでは、この操作は一度に返される 32 kB を超えるデータを処理できないことが判明しました。配列全体のサイズが 32 kB を超える場合、クライアント側の応答は 32 kB までしか正しくマーシャリング解除されません。その時点から、初期化されていないデータが取り込まれます (最終的にアンマーシャリングが失敗します)。

同じ環境で、より大きなサイズのデータ​​を返すことができる他の操作があります。ただし、これはシーケンスのシーケンスを返す唯一の操作です。

一般に、Corba を介して転送されるシーケンスまたはデータの長さに制限はありますか?

私の環境は、32 ビット Java 6 クライアント (標準 Java ORB を使用) と 64 ビット サーバー (C、2AB ORB 実装) で構成されています。

私はこれまでに試しました:

クライアント側とサーバー側の両方で、関連していると思われるいくつかの Orb プロパティを微調整しました - タイムアウト設定 ( - タイムアウトを大きな数値にtransport.ORBTCPReadTimeout設定)、GIOP 設定 ( - 両方とも大きな数値に設定)。これらの設定のいずれも動作を変更しませんでした。giop.ORBFragmentSizegiop.ORBBufferSize

パケット スニファを使用して、データがクライアントに送信されたことを確認できました。この問題は、アンマーシャリング中に発生します。

4

1 に答える 1

2

CORBA の無制限のシーケンスは、実際には少し制限されていますが、気付くほどではありません。

これらは unsigned long (または CORBA 用語では a CORBA::ULong) としてマーシャリングされ、マーシャリング エンジンに各要素が次に何回出現するかを伝えます。常に最大 2,147,483,647 個の要素を含めることができる必要があります (これは、 a のサイズである 2^32 ですCORBA::ULong)。これは 32kb をはるかに超えているため、ORB にバグがあるようです。

さらに、例外をスローするのではなく、部分的に埋めることで静かに失敗するという事実CORBA::MARSHALはかなり悪いです。ORB ベンダーに、基本のテストを開始するよう伝えてください。

于 2013-01-20T01:22:59.253 に答える