java 执行IFB_LLLLCHAR

snz8szmq  于 2023-01-29  发布在  Java
关注(0)|答案(3)|浏览(89)

我们使用带有ASCIChannel和自定义包的jpos服务器,自定义包包含一个最大长度为9999的字段。为此,我们实现了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内部的知识不多。

bvjveswy

bvjveswy1#

使用AsciiChannel时,完整消息的总长度不能超过9999(如@gerrytan已经指出的)。
AsciiChannel采用前四个字节是长度数字的ASCII值的协议。
您可能需要查看HEXChannel或NACChannel,因为它们可以容纳更大的长度。HEXChannel和NACChannel允许的长度最大为0xFFFF。

h9vpoimq

h9vpoimq2#

请参见source code for AsciiChannel class,长度上限为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());
        }
    }
rqmkfv5c

rqmkfv5c3#

通道定义是您与正在通话的系统达成一致的内容。如果您需要发送超过9999的数据,则需要按照前面的响应中所述更改通道,另一个实体也需要更改通道。通信双方需要确保他们对提取完整消息所需的长度标头有相同的理解。
您拥有的选项

  • 通信信道的两端都更新可以使用不同信道发送或接收的大小。
  • 假设通信通道的另一端被告知此更改以便能够处理,您将压缩编码为base64的大型数据。
  • 有时候规范/协议指示如何将此数据拆分为多个请求,看看是否可用。

相关问题