这不是一个重复的问题,因为上一个问题的一些功能发生了变化,这是下面的扩展。创建了一个新职位,对寻找不同解决方案的其他人也很有帮助
jpos:如何处理具有不同长度的不同标头的消息,监听相同的endpoint并使用相同的打包程序
这种情况是第三方应用程序将向jpos发送消息。可能是它将发送两种类型的消息,具有不同的消息头长度,例如一个长度为22字节,另一个长度为44字节。打包程序将不同。
根据上述解决方案的建议,我创建了一个自定义通道,它运行良好。但现在的挑战是如何为每个不同的请求类型使用不同的打包器
示例
header er1--使用x打包器
header er2--使用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[]标头,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>
在您的Channel自定义通道实现中,您可以覆盖getDynamicPackager(byte[]标头,byte[]消息)
//instantiate each as required in constructor for instance or you can make them configurable through setConfiguration
protected ISOPackager packager22, packager44;
protected byte[] len22HeaderPrefix, len44HeaderPrefix;
protected int headerPrefixLen = 4; //4 according to your other question
protected getDynamicPackager(byte[] header, byte[] message) {
if (Arrays.equals(header, len22HeaderPrefix, 0, prefixLen)) {
return packager22;
} else if (Arrays.equals(header, len44HeaderPrefix, 0, headerPrefixLen)) {
return packager44;
} else {
//return some default or throw some runtime exception exception
}
}