Ответ от нескольких участников транзакции jpos

У меня есть менеджер транзакций, который я настроил так

<txnmgr name="txnmgr" logger="Q2" class="org.jpos.transaction.TransactionManager">
    <property name="space" value="tspace:mySpace"/>
    <property name="queue" value="TransactionQueue"/>
    <property name="max-sessions" value="10"/>

    <participant class="main.java.com.transaction.manager.Switch" logger="Q2">
      <property name="0800" value="NetworkManagement" />
      <property name="0200" value="FinancialTransaction" />
    </participant>

    <participant class="main.java.com.transaction.manager.FinancialTransactionResponse" logger="Q2"/>

    <group name="NetworkManagement">
      <participant class="main.java.com.transaction.manager.NetworkManagementResponse" logger="Q2" />
    </group>

    <group name="FinancialTransaction">
      <participant class="main.java.com.transaction.manager.FinancialTransactionValidateMessage" logger="Q2" />
      <participant class="main.java.com.transaction.manager.FinancialTransactionQueryRemoteHost1" logger="Q2" />


<participant class="main.java.com.transaction.manager.FinancialTransactionQueryRemoteHost2" logger="Q2" />

    </group>

</txnmgr>

в моем FinancialTransactionQueryRemoteHost1 у меня есть

@Override
    public int prepare(long l, Serializable srlzbl) {
        try{

            channelManager =  ((ChannelManager) NameRegistrar.get("jpos-host1-adaptor"));
            ISOMsg reqMsg = (ISOMsg) ((Context) srlzbl).get(Constants.REQUEST_KEY);
            ISOMsg respMsg = channelManager.sendMsg(reqMsg);
            ((Context) srlzbl).put(Constants.RESPONSE_KEY, respMsg);
            return PREPARED;

        }catch(NameRegistrar.NotFoundException e){
            e.printStackTrace();
            return ABORTED;
        }catch(Throwable t){
            t.printStackTrace();
            return ABORTED;
        }

    }

в моем FinancialTransactionQueryRemoteHost2 у меня есть

    @Override
        public int prepare(long l, Serializable srlzbl) {
            try{

                channelManager =  ((ChannelManager) NameRegistrar.get("jpos-host2-adaptor"));
                ISOMsg reqMsg = (ISOMsg) ((Context) srlzbl).get(Constants.REQUEST_KEY);
                ISOMsg respMsg = channelManager.sendMsg(reqMsg);
                ((Context) srlzbl).put(Constants.RESPONSE_KEY, respMsg);
                return PREPARED;

            }catch(NameRegistrar.NotFoundException e){
                e.printStackTrace();
                return ABORTED;
            }catch(Throwable t){
                t.printStackTrace();
                return ABORTED;
            }

        }

в моем ответе на финансовую транзакцию у меня есть

@Override
  public int prepare(long id, Serializable context) {
    Context ctx = (Context)context;
        ISOMsg respMsg = (ISOMsg)ctx.get(Constants.RESPONSE_KEY);
 //Get IsoMsg from host1
 //Get IsoMsg from host2
 //compare field 39 response if both are 00 
        String bit39 = respMsg.getString(70);
        if(bit39==null){
            respMsg.set(39,"06");
        }
        ctx.put(Constants.RESPONSE_KEY,respMsg);
        return PREPARED;
  }

в моем ответе на транзакцию, как мне получить ответ 2 участников, чтобы я мог сравнить, прежде чем отвечать, т.е. прокомментировать выше, как я хотел бы, чтобы это было достигнуто


person Dexter    schedule 23.01.2018    source источник


Ответы (1)


Вам нужно только поместить ответы под двумя разными ключами. Скажем, ответ1 и ответ2:

In FinancialTransactionQueryRemoteHost1.prepare:

((Context) srlzbl).put("response1", respMsg);

In FinancialTransactionQueryRemoteHost2.prepare:

((Context) srlzbl).put(Constants.RESPONSE_KEY, respMsg);

Затем в Financialtransactionresponse.prepare

ISOMsg resp1 = ctx.get("response1"), resp2 = ctx.get("response2");

Вы можете использовать любые строки и определять для них константы. Вы можете повторно использовать de CONTEXT_KEY для первого и другой ключ для второго.

Кроме того, и, возможно, еще лучше, вы можете объединить ответы в своем FinancialTransactionQueryRemoteHost2 участнике.

Участники FYI запускаются последовательно.

Более того, вы можете повторно использовать стандартного участника QueryHost, см. это руководство

Благодаря ответу Муртузы Чхила на ISOMsg параллельный запрос к нескольким потокам MUX jpos, вы также можете использовать участника присоединения, как описано в Параллельная обработка, чтобы два запроса выполнялись параллельно.

person Andrés Alcarraz    schedule 23.01.2018