如何在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
相关产品推荐
相关产品推荐

