0

これを行うために、ASCIChannel と最大長 9999 の 1 つのフィールドを含むカスタム パッケージで jpos サーバーを使用しています。次のように IFB_LLLLCHAR を実装しました。

public class IFB_LLLLCHAR extends ISOStringFieldPackager {
    public IFB_LLLLCHAR() {
        super(NullPadder.INSTANCE, AsciiInterpreter.INSTANCE, BcdPrefixer.LLLL);
    }

    public IFB_LLLLCHAR(int len, String description) {
        super(len, description, NullPadder.INSTANCE, AsciiInterpreter.INSTANCE, BcdPrefixer.LLLL);
        checkLength(len, 9999);
    }

    public void setLength(int len)
    {
        checkLength(len, 9999);
        super.setLength(len);
    }
}

問題は、メッセージ全体のサイズが 9999 を超えると、送信中に次の例外がスローされるため、9999 全体を使用できなかったことです。

<exception name="len exceeded">
    java.io.IOException: len exceeded
    at org.jpos.iso.channel.ASCIIChannel.sendMessageLength(ASCIIChannel.java:80)
    at org.jpos.iso.BaseChannel.send(BaseChannel.java:528)
    at com.advam.gateway.terminalmanagementserver.gateway.LogUploadFuncTest.testLogUpload(LogUploadFuncTest.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at junit.framework.TestCase.runTest(TestCase.java:154)
    at junit.framework.TestCase.runBare(TestCase.java:127)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    </exception>

この例外が発生する理由と修正方法を教えてください。私はjposの内部についてあまり知識がありません。ありがとう

4

3 に答える 3

3

完全なメッセージの合計の長さは、AsciiChannel を使用して 9999 を超えることはできません (@gerrytan が既に指摘したように)。

AsciiChannel は、最初の 4 バイトが長さの数字の ASCII 値であるプロトコルを想定しています。

より長い長さに対応できるため、HEXChannel または NACChannel を確認することをお勧めします。HEXChannel と NACChannel は、0xFFFF までの長さを許可します。

于 2014-01-08T02:28:08.890 に答える
1

AsciiChannel クラスのソース コードを参照してください。長さは最大 9999 に制限されています

/**
 * @param len the packed Message len
 * @exception IOException
 */
protected void sendMessageLength(int len) throws IOException {
    if (len > 9999)
        throw new IOException ("len exceeded");

    try {
        serverOut.write(
            ISOUtil.zeropad(Integer.toString(len), 4).getBytes()
        );
    } catch (ISOException e) { }
}

また、checkLength()呼び出すメソッドは実際には長さをトリミングしていません。コンテンツが長すぎる場合にのみ例外をスローしました。例外が必要ない場合は、このメソッドを呼び出さないでください / 例外をキャプチャしてトリムしてください

 protected void checkLength(int len, int maxLength) throws IllegalArgumentException
    {
        if (len > maxLength)
        {
            throw new IllegalArgumentException("Length " + len + " too long for " + getClass().getName());
        }
    }
于 2013-09-30T03:40:57.240 に答える