私は髪を引き裂く原因となる異常な問題を抱えています. Netty クライアント/サーバーのセットアップがあります。サーバーはコマンド オブジェクトをクライアントに送信します。次に、クライアントは、コマンド オブジェクトで見つかった各バイナリ コマンドを、ローカル シリアル ポートに接続されたデバイスに送信します。各コマンドへの応答 (バイナリ文字列) はコマンド オブジェクト内に格納され、すべてのコマンドが実行されると、コマンド オブジェクトがサーバーに返されます。そのため、クライアント パイプラインとサーバー パイプラインの両方で ObjectEncoder と ObjectDecoder を使用しています。
特定のコマンド オブジェクトがサーバーに返されたときに、サーバーが「java.io.StreamCorruptedException: ブロック データの予期しない終了」(以下のスタック トレース) をスローする、特定の繰り返し可能なケースが 1 つあります。サーバーとクライアントの両方で Netty 3.2.7-Final を使用しており、クライアントとサーバーの両方で Oracle Java 1.7.0_02 を使用しています。
実際に頭を悩ませているのは、クライアントとサーバーを Windows 7 でローカルに実行すると、ジョブが正しく実行されるということです。Debian Linux システムでサーバーをリモートで実行すると、特定のジョブが正しく実行されます。ただし、Linux CentOS 6 システムでサーバーを実行すると、例外が発生して毎回ジョブが失敗します。(クライアントは Windows 環境で実行する必要があります)
これをさらにデバッグする方法に関する提案は大歓迎です。ObjectEncoder の拡張を調べたので、シリアル化されたオブジェクトをディスクにダンプして、何が配線されているかを確認できますが、encode メソッドによって返される ChannelBuffer の内容を取得する方法がわかりません。
java.io.StreamCorruptedException: unexpected end of block data
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1369)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:498)
at java.lang.Throwable.readObject(Throwable.java:913)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at java.util.ArrayList.readObject(ArrayList.java:733)
at sun.reflect.GeneratedMethodAccessor70.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at org.jboss.netty.handler.codec.serialization.ObjectDecoder.decode(ObjectDecoder.java:129)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:282)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:214)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:351)
at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:282)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:202)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)