You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WSO2 ESB中从inSequence传递值到outSequence?

WSO2 ESB inSequence到outSequence传递属性的正确方法

核心问题原因

你用axis2范围存储属性会丢失,因为axis2属性绑定到请求的Axis2MessageContext,而outSequence处理的是响应的Axis2MessageContext,两者是不同的上下文实例,属性不会自动跨上下文传递。

正确解决方案

方法1:使用default或operation范围存储属性

这两个范围的属性会在整个消息处理生命周期(inSequence→后端调用→outSequence)中保留,是跨序列传递属性的标准方式。

示例代理服务配置

<proxy xmlns="http://ws.apache.org/ns/synapse" name="ActionTransferProxy" transports="http https" startOnLoad="true">
    <description/>
    <target>
        <inSequence>
            <!-- 从请求中提取Action值,存储到default范围(默认可不写scope) -->
            <property name="Action" expression="//some-xpath-to-extract-action" scope="default"/>
            
            <!-- 打印日志验证属性已设置 -->
            <log level="custom">
                <property name="IN_SEQUENCE_ACTION" expression="get-property('Action')"/>
            </log>
            
            <!-- 调用后端服务 -->
            <send>
                <endpoint>
                    <address uri="http://your-backend-service-url"/>
                </endpoint>
            </send>
        </inSequence>
        <outSequence>
            <!-- 获取default范围的Action属性 -->
            <property name="RetrievedAction" expression="get-property('Action')" scope="default"/>
            
            <!-- 打印日志验证属性传递结果 -->
            <log level="custom">
                <property name="OUT_SEQUENCE_ACTION" expression="get-property('RetrievedAction')"/>
            </log>
            
            <!-- 根据Action值分支处理逻辑 -->
            <switch source="get-property('Action')">
                <case regex="Create">
                    <log level="custom">
                        <property name="PROCESSING" value="Handling Create action"/>
                    </log>
                </case>
                <case regex="Update">
                    <log level="custom">
                        <property name="PROCESSING" value="Handling Update action"/>
                    </log>
                </case>
                <default>
                    <log level="custom">
                        <property name="PROCESSING" value="Default action handling"/>
                    </log>
                </default>
            </switch>
            
            <!-- 返回响应 -->
            <send/>
        </outSequence>
        <faultSequence>
            <log level="full"/>
            <send/>
        </faultSequence>
    </target>
</proxy>

方法2:从请求上下文强制获取axis2属性(不推荐,仅作补充)

如果必须保留axis2范围,可在outSequence中通过get-property('axis2', 'Action', true)从请求上下文读取,第三个参数true表示强制从请求上下文获取:

<outSequence>
    <property name="RetrievedAction" expression="get-property('axis2', 'Action', true)"/>
    <log level="custom">
        <property name="OUT_SEQUENCE_ACTION" expression="get-property('RetrievedAction')"/>
    </log>
    <!-- 后续处理逻辑 -->
    <send/>
</outSequence>

关键注意事项

  • 优先使用default或operation范围,这是WSO2 ESB跨序列传递属性的最佳实践。
  • 若属性需在多个代理/序列间共享,可考虑application范围(全局),但需注意线程安全。
  • 排查问题时,用日志中介打印属性值是最直接的验证方式。

内容的提问来源于stack exchange,提问作者Saif Eddine Layouni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:18:12