这种情况是第三方应用程序将向jpos发送消息。可能是它将发送两种类型的消息,具有不同的消息头长度,例如一个长度为22字节,另一个长度为44字节。打包程序将是相同的。
如何根据标头类型处理这两条消息并将其路由到发行者?标头中的前4个字节将为我提供标头长度的线索。
举个例子
f3f8f6f7--表示标头长度为22字节
f4f5f6f7--表示标头长度为44字节
示例:标题="3867000000000000000002"或"45670000000000000000021601"最多44
我不知道从哪里开始。我知道我可以创建两个通道,但问题是我必须从一个endpoint端口监听
如果我想创建一个自定义频道,处理这种情况的最佳方法是什么?只是在想是否可以如下处理,在频道标题属性中我可以指定多个标题?
<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"
header="3687000000000000000002" or "3687000000000000000002"
>
<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>
我不知道如何处理这件事。
首先,如果你能避免这种情况,请这样做。你真的需要为同一个应用程序发送两个不同的标头长度吗?
正如您所说,这是第三方应用程序,我会假设答案是肯定的。
其次,应用程序是否可以将22个标头长度消息发送到与44个标头长度消息不同的端口?
如果是,最简单的方法就是让两台服务器各配置一个不同的头。这个解决方案不需要编码。
另一种选择涉及编码以编写您自己的频道,如下所述。
您只需要创建自己的Channel实现。
例如,您可以扩展NACCHannel
并覆盖sendMessageHeader
和readHeader
方法:
public class CustomChannel extends NACChannel {
byte [] len22Header = {(byte)0xf3,(byte)0xf8,(byte)0xf6,(byte)0xf7};
byte [] len44Header = {(byte)0xf4,(byte)0xf5,(byte)0xf6,(byte)0xf7};
protected byte[] readHeader(int hLen) throws IOException {
byte[] header = new byte[22];
serverIn.readFully(header, 0, 22);
if (Arrays.equals(header, len22Header, 0, 4)) {
return header;
}
header = Arrays.copyOf(header, 44);
serverIn.readFully(header, 22, 22);
}
protected 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);
}
}
然后您只需在服务器xml中使用您的通道而不是NACChannel
<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="your.package.CustomChannel"
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>