это не повторяющийся вопрос, так как в предыдущем вопросе некоторые функциональные возможности изменились, и это как расширение ниже. создал новый пост, который также будет полезен для других, которые ищут разные решения
jpos: как обрабатывать сообщения с разными заголовками разной длины, прослушивая одну и ту же конечную точку и используя один и тот же упаковщик
Сценарий стороннего приложения будет отправлять сообщения в jpos. возможно, что он будет отправлять два типа сообщений с разной длиной заголовка сообщения, скажем, один будет иметь длину 22 байта, а другой - 44 байта. Упаковщик будет другим.
Как указано в приведенном выше решении, я создал Пользовательский канал, и он работает нормально. Но теперь проблема в том, как мне использовать разные упаковщики для каждого типа запроса
пример
header1 - использовать x packager
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 (заголовок байта [], сообщение байта [])
Я получаю сообщение об ошибке, как показано ниже
<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>