0

我们正在使用带有 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 内部没有太多了解时。谢谢

4

3 回答 3

3

使用 AsciiChannel 的完整消息的总长度不能超过 9999(就像@gerrytan 已经指出的那样)。

AsciiChannel 采用一种协议,其中前四个字节是长度数字的 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 回答
1

频道定义是您与正在与之交谈的系统达成一致的内容。如果您需要发送超过 9999,您需要更改通道,如前面的响应中所述,其他实体也是如此。通信双方需要确保他们对提取完整消息的长度标头具有相同的理解。

您拥有的选项

  • 通信通道的双方更新使用不同通道可以发送或接收的大小。
  • 您压缩编码为 base64 的大数据,假设通信通道的另一端被告知此更改,以便他们可以处理它。
  • 有时,规范/协议表明如何将这些数据拆分为多个请求,看看是否可用。
于 2014-01-30T11:34:47.467 回答