1

私は髪を引き裂く原因となる異常な問題を抱えています. 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)
4

1 に答える 1

1

デコード中に問題が発生するため、

受信したチャネル バッファをログに 16 進ダンプしてからデコードし、後で分析できます。次のように、独自のバージョンの ObjectDecoder が必要です。

    @Override
protected Object decode(
        ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {

    ChannelBuffer frame = (ChannelBuffer) super.decode(ctx, channel, buffer);
    if (frame == null) {
        return null;
    }


    logger.debug("Hex dump of object frame [" + ChannelBuffers.hexDump(frame) + "]");

    return new CompactObjectInputStream(
            new ChannelBufferInputStream(frame), classResolver).readObject();
}
于 2012-01-09T16:17:10.157 に答える