Прежде всего, если вы можете избежать этого, пожалуйста, сделайте это. Вам действительно нужно отправить две разные длины заголовка для одного и того же приложения?
Поскольку вы сказали, что это стороннее приложение, я приму ответ «да».
Во-вторых, случайно, может приложение отправляет 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>