如何在Jpos-template中通过XML配置切换LOCAL/UAT交易参与者
无需修改Java代码实现参与者切换的XML配置方案
你可以通过jPOS内置的SelectParticipant或ConditionalParticipant来实现根据上下文属性动态切换LOCAL/UAT参与者,无需修改任何Java代码,仅需调整XML配置:
方案1:SelectParticipant(推荐,配置简洁)
该参与者可直接根据TransactionContext中的属性值匹配对应的目标参与者,适合简单的键值匹配场景:
<txnmgr class="org.jpos.transaction.TransactionManager" logger="Q2"> <property name="queue" value="TXNMGR"/> <property name="sessions" value="10"/> <property name="max-sessions" value="100"/> <!-- 根据上下文属性environment的值选择参与者 --> <participant class="org.jpos.transaction.participant.SelectParticipant"> <!-- 指定上下文里用来区分环境的属性键 --> <property name="key" value="environment"/> <!-- 属性值为LOCAL时,执行name为LOCAL的参与者 --> <property name="LOCAL" value="LOCAL"/> <!-- 属性值为UAT时,执行name为UAT的参与者 --> <property name="UAT" value="UAT"/> </participant> <participant name="LOCAL" class="com.sanjok.qbean.RestParticipant"> <property name="server-signature-public-key" value="***"/> <property name="server-encryption-public-key" value="***"/> <property name="base64-client-signature-private-key" value="***"/> <property name="base64-client-encryption-private-key" value="***"/> </participant> <participant name="UAT" class="com.sanjok.qbean.RestParticipant"> <property name="server-signature-public-key" value="***"/> <property name="server-encryption-public-key" value="***"/> <property name="base64-client-signature-private-key" value="***"/> <property name="base64-client-encryption-private-key" value="***"/> </participant> <participant class="org.jpos.transaction.participant.SendResponse"> </participant> </txnmgr>
- 注意:确保你的TransactionContext中存在
environment属性,值为LOCAL或UAT。如果需要基于ISO消息字段判断,可先通过ISOMsgParticipant将消息域存入上下文,再用SelectParticipant匹配。
方案2:ConditionalParticipant(灵活支持复杂条件)
如果需要多分支、范围判断等复杂逻辑,可使用该参与者结合EL表达式:
<txnmgr class="org.jpos.transaction.TransactionManager" logger="Q2"> <property name="queue" value="TXNMGR"/> <property name="sessions" value="10"/> <property name="max-sessions" value="100"/> <!-- 基于EL表达式的条件判断 --> <participant class="org.jpos.transaction.participant.ConditionalParticipant"> <!-- 条件:上下文environment字段等于LOCAL --> <property name="if" value="${ctx.environment == 'LOCAL'}"/> <!-- 满足条件时执行LOCAL参与者 --> <property name="then" value="LOCAL"/> <!-- 否则执行UAT参与者 --> <property name="else" value="UAT"/> </participant> <participant name="LOCAL" class="com.sanjok.qbean.RestParticipant"> <property name="server-signature-public-key" value="***"/> <property name="server-encryption-public-key" value="***"/> <property name="base64-client-signature-private-key" value="***"/> <property name="base64-client-encryption-private-key" value="***"/> </participant> <participant name="UAT" class="com.sanjok.qbean.RestParticipant"> <property name="server-signature-public-key" value="***"/> <property name="server-encryption-public-key" value="***"/> <property name="base64-client-signature-private-key" value="***"/> <property name="base64-client-encryption-private-key" value="***"/> </participant> <participant class="org.jpos.transaction.participant.SendResponse"> </participant> </txnmgr>
- 说明:
ctx代表TransactionContext对象,可根据实际需求修改表达式,比如判断ISO消息域:${iso.get(70) == '001'}(域70值为001时走LOCAL)。
关于JSParticipant的说明
JSParticipant也能实现需求,它允许嵌入JSP脚本逻辑,但配置繁琐,仅推荐用于极复杂的判断场景,示例如下:
<participant class="org.jpos.transaction.participant.JSParticipant"> <property name="script"><![CDATA[ <% String env = (String) ctx.get("environment"); if ("LOCAL".equals(env)) { setParticipant("LOCAL"); } else if ("UAT".equals(env)) { setParticipant("UAT"); } %> ]]></property> </participant>
内容的提问来源于stack exchange,提问作者Sanjok
相关产品推荐
相关产品推荐

