JPOS发送ISO消息不完整求助:重复连接才正常如何解决?
JPOS BASE24TCPChannel发送ISO 0800消息不完整问题解决
问题描述
使用BASE24TCPChannel发送ISO 0800消息时,首次连接发送的消息内容不完整;但在send操作后添加一次重复的connect调用,消息就能完整送达。
场景代码与数据
首次连接发送代码
// Create Packager based on XML that contain DE type GenericPackager packager = new GenericPackager("PackISO.xml"); // 创建BASE24TCPChannel实例 BASE24TCPChannel c = new BASE24TCPChannel("localhost", 5000, packager); c.setHeader("ISO008000099"); // 创建ISO消息 ISOMsg isoMsg = new ISOMsg(); isoMsg.setPackager(packager); isoMsg.setMTI("0800"); isoMsg.set(7, "1088110140"); isoMsg.set(11, "087478"); isoMsg.set(70, "999"); c.connect(); c.send(isoMsg);
首次发送的十六进制数据
00000000: 0044 4953 4f30 3038 3030 3030 3939 3038 .DISO00800009908 00000010: 3030 3832 3230 3030 3030 3030 3030 3030 0082200000000000 00000020: 3030 3034 3030 3030 3030 3030 3030 3030 0004000000000000 00000030: 3030 3130 3838 3131 3031 3430 3038 3734 0010881101400874
(注:缺少字段11的78和字段70的999及结束符)
添加重复连接的代码
// Create Packager based on XML that contain DE type GenericPackager packager = new GenericPackager("PackISO.xml"); // 创建BASE24TCPChannel实例 BASE24TCPChannel c = new BASE24TCPChannel("localhost", 5000, packager); c.setHeader("ISO008000099"); // 创建ISO消息 ISOMsg isoMsg = new ISOMsg(); isoMsg.setPackager(packager); isoMsg.setMTI("0800"); isoMsg.set(7, "1088110140"); isoMsg.set(11, "087478"); isoMsg.set(70, "999"); c.connect(); c.send(isoMsg); c.connect();
添加重复连接后发送的十六进制数据
00000000: 0044 4953 4f30 3038 3030 3030 3939 3038 .DISO00800009908 00000010: 3030 3832 3230 3030 3030 3030 3030 3030 0082200000000000 00000020: 3030 3034 3030 3030 3030 3030 3030 3030 0004000000000000 00000030: 3030 3130 3838 3131 3031 3430 3038 3734 0010881101400874 00000040: 3738 3939 3903 78999.
(注:内容完整,包含所有字段和结束符)
问题原因分析
重复connect操作能让消息完整发送,是因为调用connect时会关闭当前已建立的Socket连接,关闭操作会强制刷新Socket输出缓冲区中未发送的数据。本质问题是首次send后,输出缓冲区的数据没有被立即刷新,导致消息未完整发送。
解决方案
无需依赖重复connect这种非常规操作,以下是几种合理的解决方式:
1. 使用带刷新参数的send重载方法
JPOS的Channel类提供send(ISOMsg msg, boolean flush)重载方法,指定flush=true可在发送后立即刷新输出流:
c.connect(); c.send(isoMsg, true); // 第二个参数设为true强制刷新
2. 手动刷新输出流
在send后手动获取Socket输出流并调用flush():
c.connect(); c.send(isoMsg); c.getSocket().getOutputStream().flush();
注意:需处理IOException异常。
3. 配置BASE24TCPChannel自动刷新
检查BASE24TCPChannel的实现,部分版本支持通过设置参数开启自动刷新:
c.setAutoFlush(true);
设置后每次send都会自动刷新输出流。
内容的提问来源于stack exchange,提问作者Raul Roa
相关产品推荐
相关产品推荐

