2012-12-21 44 views
5

Tôi đã yêu cầu Xà phòng vào luồng mule. Am được giao nhiệm vụ lấy thông tin ra khỏi tải trọng và tùy thuộc vào kết quả, đẩy yêu cầu ban đầu đến các hàng đợi jms khác nhau.Làm cách nào để ghi đè tải trọng trong số

Để lấy thông tin mong muốn ngoài tải trọng, tôi đang sử dụng trình chuyển đổi XSLT (không phải XPath, vì tôi cần lấy thuộc tính IDREF từ một phần tử, dựa trên IDREF, lấy phần tử và sau đó là phần tử con ra khỏi IDREF vật).

Dựa trên kết quả của sự biến dạng XSLT, tôi sử dụng yếu tố lựa chọn để đẩy tải trọng ban đầu. Đang lưu trữ tải trọng ban đầu trong một phiên (có thể thực hiện nó trong Inbound). Sau khi sửa đổi XSLT, áp dụng bộ định tuyến lựa chọn để tìm ra hàng đợi thích hợp, và sau đó muốn đẩy tải trọng ban đầu vào hàng đợi (tải trọng ban đầu được lưu trữ trong một biến phiên). Tôi đang sử dụng phần tử <expression-component>. Dưới đây là đoạn con la-dòng chảy:

<flow name="ProcessXML121Order"> 
    <jms:inbound-endpoint queue="mviq.121.order" exchange-pattern="one-way" /> 
    <logger message="121 order payload is #[payload]" level="INFO" /> 
    <message-properties-transformer scope="session"> 
     <add-message-property key="mviPayload" value="#[payload]"/> 
    </message-properties-transformer> 
    <xm:xslt-transformer xsl-file="chooseVendor.xslt" /> 
    <logger message="After xsl file payload is #[payload]" level="INFO" />  
    <choice> 
     <when expression="'EMSI'"> 
      <logger message="Vendor is EMSI" level="INFO" /> 
      <expression-component>payload=#[header:SESSION:mviPayload]</expression-component> 
      <jms:outbound-endpoint queue="mviq.121.order.emsi" /> 
     </when> 
     <when expression="'PRMD'"> 
      <logger message="Vendor is PRMD" level="INFO" /> 
      <jms:outbound-endpoint queue="mviq.121.order.prmd" /> 
     </when> 
     <when expression="'RSA'"> 
      <logger message="Vendor is RSA" level="INFO" /> 
      <logger message="RSA payload is #[payload]" level="INFO" /> 
      <jms:outbound-endpoint queue="mviq.121.order.rsa" /> 
     </when> 
     <otherwise> 
      <logger message="Vendor is Error" level="INFO" /> 
      <logger message="Vendor error payload is #[payload]" level="INFO" /> 
      <jms:outbound-endpoint queue="mviq.error" /> 
     </otherwise> 
    </choice> 
</flow> 

ngoại lệ Sau đây là ném khi đánh giá tải trọng = # [tiêu đề: PHIÊN: mviPayload]

[ProcessXML121Order.stage1.02] exception.AbstractExceptionListener (AbstractExceptionListener.java:296) - 
******************************************************************************** 
Message    : Execution of the expression "payload=#[header:SESSION:mviPayload]" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: byte[] 
Code     : MULE_ERROR-29999 
-------------------------------------------------------------------------------- 
Exception stack is: 
1. [Error: illegal use of operator: +] 
[Near : {... Unknown ....}] 
      ^
[Line: 1, Column: 0] (org.mvel2.CompileException) 
    org.mvel2.ast.OperatorNode:46 (null) 
2. Execution of the expression "payload=#[header:SESSION:mviPayload]" failed. (org.mule.api.expression.ExpressionRuntimeException) 
    org.mule.el.mvel.MVELExpressionLanguage:211 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/expression/ExpressionRuntimeException.html) 
3. Execution of the expression "payload=#[header:SESSION:mviPayload]" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: byte[] (org.mule.api.MessagingException) 
    org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor:35 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MessagingException.html) 
-------------------------------------------------------------------------------- 
Root Exception stack trace: 
[Error: illegal use of operator: +] 
[Near : {... Unknown ....}] 
      ^
[Line: 1, Column: 0] 
    at org.mvel2.ast.OperatorNode.getReducedValueAccelerated(OperatorNode.java:46) 
    at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85) 
    at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:105) 
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything) 
******************************************************************************** 

Tôi đã 2 câu hỏi:

  1. Làm cách nào để ghi đè tải trọng ban đầu? (Không nói đây là cách tốt nhất để đi)
  2. Cách tiếp cận tốt hơn trong trường hợp này là gì? Có nên giữ nguyên tải trọng ban đầu (trong trường hợp này) và lưu trữ đầu ra XSLT trong biến khác không? Làm thế nào tôi có thể làm điều đó? Con đường (thành phần con la) Tôi có thể sử dụng để đạt được điều đó là gì? Tôi rất mới với Mule và tìm kiếm lời khuyên của cộng đồng.

Cảm ơn bạn đã dành thời gian xem xét điều này.

Trả lời

16

Trước khi trả lời câu hỏi của bạn, chúng ta hãy viết lại biểu hiện bị hỏng này:

<expression-component>payload=#[header:SESSION:mviPayload]</expression-component> 

như:

<set-payload value="#[sessionVars.mviPayload]" /> 

Sau đây sẽ làm việc quá nhưng sẽ phức tạp hơn mà không có lý do chính đáng:

<expression-component>payload=sessionVars.mviPayload</expression-component> 

Đây cũng là:

<message-properties-transformer scope="session"> 
    <add-message-property key="mviPayload" value="#[payload]"/> 
</message-properties-transformer> 

sẽ được viết tốt hơn:

<set-session-variable variableName="mviPayload" value="#[message.payload]" /> 

Bây giờ câu hỏi của bạn:

  1. Sử dụng set-payload
  2. gì bạn đang làm là tốt nhất: máy biến áp, giống như XSL-T, áp dụng một cách tự nhiên với tải trọng tin nhắn hiện tại để lưu bản gốc vào một thuộc tính thì việc chuyển tải trọng chính là OK. Chỉ một điều: thích biến lưu lượng thay vì biến phiên. Thật vậy, trong trường hợp của bạn, tôi không nghĩ rằng bạn cần tải trọng ban đầu bên ngoài luồng này, vì vậy lưu trữ trong phiên là quá mức cần thiết.

Vì vậy, tôi đề nghị bạn sử dụng:

<set-variable variableName="mviPayload" value="#[message.payload]" /> 

để lưu trữ các tải trọng ban đầu và sau đây để thiết lập lại nó:

<set-payload value="#[mviPayload]" /> 
+0

trình như một say mê. Cảm ơn bạn rất nhiều David –

+0

Chính xác những gì tôi cần là tốt. Cảm ơn! Có vẻ rất đơn giản bây giờ tôi biết làm thế nào để làm điều đó. – SteveS

+5

Tôi càng nhận được nhiều hơn vào con la, tôi càng thấy rằng hầu hết mọi thứ khá đơn giản khi bạn tìm ra cách chính xác để làm điều đó. Tôi đã thử một triệu cách phức tạp để thực hiện các tác vụ đơn giản và câu trả lời thường rất đơn giản – Aheinlein

0

Sử dụng Set-Payload và cung cấp các dữ liệu được ghi đè.

+0

Vui lòng cung cấp một ví dụ và/hoặc một số thông tin cơ bản. – m02ph3u5

-1

Bạn có thể thực hiện việc này bằng nhiều cách.

  1. Sử dụng thiết tải trọng
  2. Sử dụng ngôn luận, # [tải trọng = '']
  3. Sử dụng một biến áp/thành phần
Các vấn đề liên quan