我们使用带有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内部的知识不多。
3条答案
按热度按时间bvjveswy1#
使用AsciiChannel时,完整消息的总长度不能超过9999(如@gerrytan已经指出的)。
AsciiChannel采用前四个字节是长度数字的ASCII值的协议。
您可能需要查看HEXChannel或NACChannel,因为它们可以容纳更大的长度。HEXChannel和NACChannel允许的长度最大为0xFFFF。
h9vpoimq2#
请参见source code for AsciiChannel class,长度上限为9999
此外,您调用的
checkLength()
方法实际上并没有修剪长度,它只是在内容过长时抛出异常。如果您不希望出现异常,则不要调用此方法/捕获异常并修剪它rqmkfv5c3#
通道定义是您与正在通话的系统达成一致的内容。如果您需要发送超过9999的数据,则需要按照前面的响应中所述更改通道,另一个实体也需要更改通道。通信双方需要确保他们对提取完整消息所需的长度标头有相同的理解。
您拥有的选项