Response from multiple transaction participant jpos

我的梦境 提交于 2019-12-24 06:10:11

问题


I have a transaction manager which i configured like this

<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>

in my FinancialTransactionQueryRemoteHost1 i have

@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;
        }

    }

in my FinancialTransactionQueryRemoteHost2 i have

    @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;
            }

        }

in my Financialtransactionresponse i have

@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;
  }

in my transactionresponse how do i get the response of the 2 participant so i can compare before responding i.e comment above on how i would like it to be achieved


回答1:


You only need to put the responses under two different keys. Let's say response1 and response2:

In FinancialTransactionQueryRemoteHost1.prepare:

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

In FinancialTransactionQueryRemoteHost2.prepare:

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

Then in Financialtransactionresponse.prepare

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

You can use whatever strings you want and define contants for them. You can reuse de CONTEXT_KEY for the first and another key for the second.

Also and perhaps better yet, you can merge the replies in your FinancialTransactionQueryRemoteHost2 participant.

FYI participants are ran sequentially.

And even more you could reuse the standard QueryHost participant see this tutorial

Thanks to Murtuza Chhil response to ISOMsg parallel request to multiple MUX jpos thread you can also use the join participant as described in Parallel Processing to make the two queries in parallel.



来源:https://stackoverflow.com/questions/48399339/response-from-multiple-transaction-participant-jpos

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!