【问题标题】:Maintaining Mule Message维护骡消息
【发布时间】:2015-05-04 00:16:29
【问题描述】:

与本次讨论类似Maintain Payload State during mule flow execution

我想知道如何在整个流程中维护完整的 Mule 消息。 在收到用户有权调用它的信息后,我试图调用球衣资源组件。在此授权请求中,有效负载和原始 http 请求被更改。

我的困境是我不想先调用资源,因为那样效率低且不安全,但是我看不到任何其他可行的方法来做到这一点。

<flow name="test">
    <http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="1234" path="test" doc:name="HTTP"/>
    <!-- sub-flow here which changes the MuleMessage and loses all original inbound properties -->

    <jersey:resources doc:name="REST">
        <component class="com.Test" />
    </jersey:resources>
</flow>

提前感谢您的帮助

【问题讨论】:

    标签: java http jersey mule


    【解决方案1】:

    Mule 3 包含两个scopes,可让您在执行其他消息处理器的同时保留原始消息:

    1. 如果您必须等待子流程完成,因为您需要使用子流程生成的信息,请使用 message enricher 像这样。一旦子流完成对消息的处理,此示例将变量“授权”分配给任何有效负载。

      <enricher target="#[variable:authorized]"> <flow-ref name="checkAuthorization" /> </enricher>

    2. 如果在允许 Jersey 资源运行之前不需要等待子流程完成,请使用 async 范围,如下所示:

      <async> <flow-ref name="goForthAndDoSomething" /> </async>

    【讨论】:

      【解决方案2】:

      有多种方法可以保存 mule 消息及其属性,以便在需要时检索它。在您的情况下,您可以将整个 Mule 消息保存在变量中并在需要时检索它,例如:

      <flow name="test">
          <http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="1234" path="test" doc:name="HTTP"/>
         <!-- You save your entire message in a session variable named entireMessage before calling a subflow-->
      <set-session-variable variableName="entireMessage" value="#[message.payload]" />
       <!-- You can now call your Sub flow -->
      
          <jersey:resources doc:name="REST">
              <component class="com.Test" />
          </jersey:resources>
      </flow>
      

      在上述流程中,您将 Mule 消息存储在名为 entireMessage 的会话变量中。您可以在任何需要的任何流程中轻松检索此会话变量的值,如下所示:-

      <logger level="INFO" message="#[sessionVars['entireMessage']]"/>
      

      这将打印你的骡消息

      还有一种替代方法可以在 http 标头被更改之前存储它。 您还可以使用以下内容:-

      <flow name="test">
       <http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="1234" path="test" doc:name="HTTP"/>
             <!-- You copy all the HTTP headers before calling a subflow-->
       <copy-properties propertyName="http.*" doc:name="Copy All HTTP Headers"/>  
        <!-- You can now call your Sub flow -->
      
         <jersey:resources doc:name="REST">
            <component class="com.Test" />
          </jersey:resources>
      </flow>
      

      上述流程将在调用任何其他流程之前复制所有 HTTP 标头

      更新流程:-

      如果您的 Jersy 组件需要原始未更改的有效负载,请用原始有效负载覆盖当前有效负载 strong> 使用 set payload 组件

      存储在会话变量中
       <flow name="test">
              <http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="1234" path="test" doc:name="HTTP"/>
             <!-- You save your entire message in a session variable named entireMessage before calling a subflow-->
          <set-session-variable variableName="entireMessage" value="#[message.payload]" />
           <!-- You can now call your Sub flow -->
      
       <!-- overwrite current payload with original unaltered payload -->   
      <set-payload value="#[sessionVars['entireMessage']]" doc:name="Set Payload"/>
              <jersey:resources doc:name="REST">
                  <component class="com.Test" />
              </jersey:resources>
          </flow>
      

      【讨论】:

      • 即使我在变量中设置了 mule 消息,jersey 组件仍然会查看当前的有效负载。我相信球衣组件依赖于 current mule 消息的内容。 @anirban-sen-chowdhary
      • 是的,这是肯定的.. 但问题是你想用原始有效载荷做什么?你想把原始有效载荷放在 jersy 组件上吗?在这种情况下,使用设置有效负载组件用原始有效负载覆盖当前有效负载...请查看我更新的流程...
      • 这确实包含我所追求的有效负载,但不包含我发出请求所需的任何 http 标头。除了所有标题属性,我该如何做等效?
      • 您在 http 入站端点之后使用 将复制您需要的所有 HTTP 标头..跨度>
      • 还有一件事,请将其更改为 因为 #[message] 将包含整个 Mule 消息
      【解决方案3】:

      尝试像这样在会话中存储原始消息:

          <message-properties-transformer scope="session" doc:name="Save original message">
              <add-message-property key="originalMessage" value="#[message:payload]"></add-message-property>
          </message-properties-transformer>
      

      然后尝试像这样从会话中获取它:

      <expression-transformer evaluator="..." expression="SESSION:originalMessage" doc:name="Restore original message"></expression-transformer>
      

      【讨论】:

      • 即使我在变量中设置了 mule 消息,jersey 组件仍然会查看当前的有效负载。我相信球衣组件依赖于 current mule 消息的内容。 @andres
      【解决方案4】:

      感谢您的所有帮助。最终的解决方案是:

      <flow name="test">
          <http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="1234" path="test" doc:name="HTTP"/>
      
          <enricher target="#[variable:unwantedPayload]" source="#[payload]">
              <flow-ref name="anotherFlowCalled" />
          </enricher>
      
          <jersey:resources doc:name="REST">
              <component class="com.Test" />
          </jersey:resources>
      </flow>
      

      【讨论】:

        【解决方案5】:

        将 mule 消息存储到会话中的最佳方式,无论您的流是否包含子流,都是私有流会话变量,直到执行结束。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-16
          • 1970-01-01
          • 2011-04-09
          • 1970-01-01
          • 1970-01-01
          • 2013-04-11
          • 1970-01-01
          相关资源
          最近更新 更多