【发布时间】:2020-03-30 06:38:42
【问题描述】:
这不是一个重复的问题,因为上一个问题的某些功能发生了变化,这是对以下问题的扩展。创建了一个新帖子,对寻找不同解决方案的其他人也很有帮助
场景是第三方应用程序将向 jpos 发送消息。可能是它会发送两种消息头长度不同的消息,一种是 22 字节,另一种是 44 字节。打包程序会有所不同。
按照上述解决方案的建议,我创建了一个自定义通道,它工作正常。但现在的挑战是我如何为每个不同的请求类型使用不同的打包器
例子
header1 -- 使用 x 打包器
header2 -- 使用 y 打包器
如果需要,我必须创建新的打包程序吗?如何链接服务器和打包程序以及标头类型。 看起来很有挑战性,jpos 也变得很有趣。
<property name="packager-config" value="cfg/packager/CISebcdic.xml"="True" />
<server class="org.jpos.q2.iso.QServer" logger="Q2" name="gwmip-server-7003" realm="bnet-server-8000">
<attr name="port" type="java.lang.Integer">7003</attr>
<channel class="org.jpos.iso.channel.NACChannel"
packager="org.jpos.iso.packager.GenericPackager"
type="server"
logger="Q2"
>
<property name="packager-config" value="cfg/packager/CISebcdic.xml" debug="True" />
<property name="timeout" value="180000"/>
</channel>
<request-listener class="org.jpos.iso.IncomingListener" logger="Q2" realm="incoming-request-listener">
<property name="queue" value="GWMIPTXNMGR" />
<property name="ctx.DESTINATION" value="jPOS-AUTORESPONDER" />
</request-listener>
</server>
请帮忙,
提前致谢, 下面完全丢失的是我正在尝试的那个,问题出在
受保护的 ISOPackager getDynamicPackager(byte[] header, byte[] 留言)
我收到如下错误
<log realm="gwmip-server-5281.server.session/10.157.152.95:26215" at="2020-04-18T00:52:22.018">
<session-error>
<exception name="unexpected exception">
java.io.IOException: unexpected exception
at org.jpos.iso.BaseChannel.receive(BaseChannel.java:787)
at org.jpos.iso.ISOServer$Session.run(ISOServer.java:344)
at org.jpos.util.ThreadPool$PooledThread.run(ThreadPool.java:76)
Caused by: java.lang.NullPointerException
at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:70)
at java.nio.ByteBuffer.wrap(ByteBuffer.java:373)
at org.jpos.iso.channel.GWMipChannel.getDynamicPackager(GWMipChannel.java:73)
at org.jpos.iso.BaseChannel.receive(BaseChannel.java:743)
... 2 more
更新自定义频道
package org.jpos.iso.channel;
import org.jpos.core.Configuration;
import org.jpos.core.ConfigurationException;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.ISOPackager;
import org.jpos.iso.packager.GenericPackager;
import org.jpos.iso.packager.MadaPackager;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;
public class GWMipChannel extends NACChannel {
byte[] madaHeader = {(byte) 0x00, (byte) 0x18, (byte) 0xd6, (byte) 0xf3, (byte) 0xf6, (byte) 0xf8, (byte) 0xf7};
byte[] nitmxHeader = {(byte) 0x00, (byte) 0x18, (byte) 0xd6, (byte) 0xf3, (byte) 0xf7, (byte) 0xf3, (byte) 0xf2};
byte[] response_mada_header = {(byte) 0x00, (byte) 0x31, (byte) 0xc9, (byte) 0xf3, (byte) 0xf6, (byte) 0xf8, (byte) 0xf7};
@Override
protected byte[] readHeader(int hLen) throws IOException {
byte[] header = new byte[25];
serverIn.readFully(header, 0, 25);
boolean mada_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(madaHeader));
boolean nitmx_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(nitmxHeader));
boolean rsp_mada_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(response_mada_header, 0, 7));
ISOPackager packager;
if (mada_header) {
return header;
} else if (nitmx_header) {
header = Arrays.copyOf(header,47 );
serverIn.readFully(header, 25, 22);
return header;
} else if (rsp_mada_header) {
//serverIn.readFully(header, 0, 50);
header = Arrays.copyOf(header, 48);
serverIn.readFully(header, 0, 48);
return header;
}
return header;
}
@Override
protected void sendMessageHeader(ISOMsg m, int len) throws IOException {
byte[] header = m.getHeader();
//assume header is the one to send, and already has 22 or 44 length
//or you can check
serverOut.write(header);
}
@Override
protected ISOPackager getDynamicPackager(byte[] header, byte[] message) {
boolean mada_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(madaHeader,0,7));
boolean nitmx_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(nitmxHeader,0,7));
ISOPackager packager = null;
if(mada_header) {
try {
packager = new GenericPackager("cfg/packager/CISebcidic_mada.xml");
} catch (ISOException e) {
e.printStackTrace();
}
}
else if (nitmx_header) {
try {
packager = new GenericPackager("cfg/packager/AS2805_NITMX.xml");
} catch (ISOException e) {
e.printStackTrace();
}
} else {
Exception e = new ISOException();
e.printStackTrace();
//return some default or throw some runtime exception exception
}
return packager;
}
}
服务器配置文件是
<server class="org.jpos.q2.iso.QServer" logger="Q2" name="gwmip-server-5281" realm="gwmip-server-5281">
<attr name="port" type="java.lang.Integer">5281</attr>
<channel class="org.jpos.iso.channel.GWMipChannel"
packager="org.jpos.iso.packager.GenericPackager"
type="server"
logger="Q2"
header="0018D6F3F7F3F2000000000000000000000000000000000002"
>
<property name="packager-config" value="cfg/packager/AS2805_NITMX.xml" debug="True" />
<property name="timeout" value="180000"/>
</channel>
<request-listener class="org.jpos.iso.IncomingListener" logger="Q2" realm="incoming-request-listener">
<property name="queue" value="GWMIPTXNMGR" />
<property name="ctx.DESTINATION" value="gwmip-AUTORESPONDER" />
</request-listener>
</server>
【问题讨论】:
标签: jpos