#java #jpos
#java #jpos
Вопрос:
Я настраиваю JAR-сервер jPOS шаг за шагом с помощью этого. Я создаю сервер с помощью приведенного ниже кода :
public class jPOSServer implements ISORequestListener {
public static void main(String[] args) {
try {
Logger logger = new Logger();
logger.addListener(new SimpleLogListener(System.out));
XMLChannel serverChannel = new XMLChannel("localhost", 9000, new XMLPackager());
((LogSource) serverChannel).setLogger(logger, "server-channel-logger");
ISOServer isoServer = new ISOServer(9000, serverChannel, null);
isoServer.setLogger(logger, "server-logger");
isoServer.addISORequestListener(new jPOSServer());
new Thread(isoServer).start();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean process(ISOSource isoSource, ISOMsg isoMsg) {
ISOMsg m = isoMsg;
try {
m.setMTI("0830");
m.set(11, "000002");
m.set(41, "00000002");
isoSource.send(m);
return true;
} catch (ISOException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
}
Войдите на сервер JAR здесь:
<log realm="org.jpos.transaction.TransactionManager" at="2019-04-24T15:25:04.787" lifespan="24ms">
<abort>
txnmgr-1:idle:1
<context>
TIMESTAMP: Wed Apr 24 15:25:04 IRDT 2019
SOURCE: org.jpos.iso.channel.XMLChannel@7217f905
REQUEST:
<isomsg direction="incoming">
<!-- org.jpos.iso.packager.XMLPackager -->
<field id="0" value="0800"/>
<field id="11" value="000001"/>
<field id="41" value="00000001"/>
<field id="70" value="301"/>
</isomsg>
RESULT:
<result>
<fail>
[MISCONFIGURED_ENDPOINT] o.j.t.p.QueryHost.prepare:60 'DESTINATION' not present in Context
</fail>
</result>
LOGEVT:
<info>
RESPONSE not present
</info>
</context>
prepare: o.j.t.p.QueryHost ABORTED READONLY NO_JOIN
prepareForAbort: o.j.t.p.SendResponse
abort: o.j.t.p.SendResponse
in-transit=0, head=2, tail=2, paused=0, outstanding=0, active-sessions=2/128, tps=0, peak=0, avg=0.00, elapsed=22ms
<profiler>
prepare: o.j.t.p.QueryHost [20.5/20.5]
prepareForAbort: o.j.t.p.SendResponse [0.8/21.3]
abort: o.j.t.p.SendResponse [0.8/22.1]
end [28.3/50.5]
</profiler>
</abort>
</log>
<log realm="xml-server-8000/127.0.0.1:61804" at="2019-04-24T15:25:07.721" lifespan="3002ms">
<receive>
<io-timeout/>
</receive>
</log>
<log realm="xml-server-8000.server.session/127.0.0.1:61804" at="2019-04-24T15:25:07.725">
<session-end/>
</log>
<log realm="org.jpos.q2.iso.ChannelAdaptor" at="2019-04-24T15:29:57.225" lifespan="1ms">
<warn>
channel-receiver-jpos-receive
Read timeout / EOF - reconnecting
</warn>
</log>
Я отправляю данные telnet localhost 8000
на JAR-сервер через порт 8000, а JAR-сервер передает данные на сервер через порт 9000. Сервер JAR получает данные и регистрирует данные, отправляет данные на сервер, а сервер получает данные. но Read timeout
произошла ошибка. Я отлаживаю файл JAR и обнаружил, что ошибка вызвана b = this.streamReceive();
на BaseChannel.java:777.
Как я могу это исправить? Спасибо.
Ответ №1:
что значит ошибка в b = this.streamReceive()
? Ваша проблема, похоже, заключается в следующем:
<result>
<fail>
[MISCONFIGURED_ENDPOINT] o.j.t.p.QueryHost.prepare:60 'DESTINATION' not present in Context
</fail>
</result>
Это означает, что участник QueryHost не знает, куда отправить сообщение, и поэтому у вас нет ответа, вам нужно добавить мультиплексирование назначения в контекст, по-видимому, под ключом «НАЗНАЧЕНИЕ». Я не знаю, как вы создаете контекст, если он использует IncomingListener, вам не хватает этой записи
<property name="ctx.DESTINATION" value="jPOS-AUTORESPONDER" />
Изменение jPOS-AUTORESPONDER
для любого вашего имени mux.
Комментарии:
1. Спасибо за ваш повтор. Я добавляю ` НАЗНАЧЕНИЕ» значение=»jPOS-АВТООТВЕТЧИК» />` to
50_xml_server.xml
но ошибка все еще возникает.2. Я решаю проблему, только добавив метод:
m.setMTI("830");
toprocess()
. Поэтому сначала отправьте данные с клиента на порт 800 (JAR-сервер), затем изменитеMIT
сообщение и отправьте на порт 9000. Но проблема в том, что я не могу понять, почему я должен изменитьMIT
вprocess
методе, и тогда все будет в порядке!3. это потому, что mux принимает в качестве ответа только ответы.
0830
это ответ на,0820
но0820
это не так. Вы также можете использоватьm.setResponseMTI()