2014-02-17 98 views
0

我需要發送多個響應從一個mule流一個http端點,這將是JSON和另一個SMTP端點收件人收到自定義電子郵件。如果我使用轉換器來轉換默認的json響應,那麼兩個端點都會收到相同的自定義電子郵件格式。所以,我怎麼可以把默認的JSON響應HTTP端點和定製變壓器生成的電子郵件的SMTP端點下面是我的流程和自定義變壓器騾多重響應

<?xml version="1.0" encoding="UTF-8"?> 

<mule xmlns:smtp="http://www.mulesoft.org/schema/mule/smtp" xmlns:smtps="http://www.mulesoft.org/schema/mule/smtps" xmlns:data-mapper="http://www.mulesoft.org/schema/mule/ee/data-mapper" xmlns:email="http://www.mulesoft.org/schema/mule/email" xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:jersey="http://www.mulesoft.org/schema/mule/jersey" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.mulesoft.org/schema/mule/jersey http://www.mulesoft.org/schema/mule/jersey/current/mule-jersey.xsd 
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd 
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd 
http://www.mulesoft.org/schema/mule/email http://www.mulesoft.org/schema/mule/email/current/mule-email.xsd 
http://www.mulesoft.org/schema/mule/ee/data-mapper http://www.mulesoft.org/schema/mule/ee/data-mapper/current/mule-data-mapper.xsd 
http://www.mulesoft.org/schema/mule/smtps http://www.mulesoft.org/schema/mule/smtps/current/mule-smtps.xsd"> 
    <data-mapper:config name="json2_to_json" transformationGraphPath="json2_to_json.grf" doc:name="json_to_json"/> 

    <flow name="jirarestFlow3" doc:name="jirarestFlow3"> 
     <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="6767" doc:name="HTTP" contentType="application/json"/> 
     <logger message="This is from hari #[message.payload]" level="DEBUG" doc:name="Logger"/> 
     <data-mapper:transform config-ref="json2_to_json" doc:name="JSON To JSON"/> 
     <logger level="DEBUG" doc:name="Logger" message="This is from Data Mapper #[json:fields/priority/id]"/> 
     <set-variable variableName="myPayload" value="#[json:fields/reporter/emailAddress]" doc:name="tmpPayload"/> 
     <logger message="MyPayload is #[myPayload]" level="DEBUG" doc:name="Logger"/> 

      <http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="9999" path="rest/api/2/issue/" method="POST" user="" password="" contentType="application/json" doc:name="HTTP"/> 
     <response> 
      <!--set-variable variableName="responsePayload" value="#[message.payload]" doc:name="respPayload"/--> 
      <!--http:response-builder doc:name="HTTP Response Builder" contentType="text/plain" status="200"/--> 
      <!--expression-transformer doc:name="Expression" /--> 
      <custom-transformer class="org.hhmi.transformer.EmailBodyTransformer" doc:name="Java"/> 
      <smtps:outbound-endpoint host="smtp.gmail.com" port="465" user="pandalai" password="soapui67" to="#[myPayload]" from="[email protected]" subject="Jira Ticket" responseTimeout="10000" mimeType="text/plain" doc:name="SMTP"> 
       <email:string-to-email-transformer doc:name="Email to String"/>      
      </smtps:outbound-endpoint> 
      </response> 

    </flow> 
</mule> 

定製變壓器

package org.xxx.transformer; 

import org.apache.log4j.Logger; 

import org.xxx.dto.JsonBean; 
import org.mule.api.MuleMessage; 
import org.mule.api.transformer.TransformerException; 

import org.mule.transformer.AbstractMessageTransformer; 
import java.util.HashMap; 
import java.util.Map; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.type.TypeReference; 

public class EmailBodyTransformer extends AbstractMessageTransformer { 
    public static Logger logger = Logger.getLogger(EmailBodyTransformer.class); 

    @Override 
    public Object transformMessage(MuleMessage message, String outputEncoding) 
      throws TransformerException { 
     // TODO Auto-generated method stub 
     StringBuffer html = new StringBuffer(); 
     Map<String,String> map = new HashMap<String,String>(); 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonBean jBean = new JsonBean(); 
     try { 
      logger.debug("EmailBodyTransformer payload " 
        + message.getPayloadAsString()); 
      logger.debug("EmailBodyTransformer class " + message.getClass()); 

      map = mapper.readValue(message.getPayloadAsString(), 
        new TypeReference<HashMap<String,String>>(){}); 
       jBean.setId(map.get("id")); 
       jBean.setKey(map.get("key")); 
       jBean.setSelf(map.get("self")); 
       System.out.println("EmailBodyTransformer id from map: "+ jBean.getId()); 
       System.out.println("EmailBodyTransformer map: "+ map); 

/*    html.append(""); 
       html.append(""); 
       html.append(""); 
       html.append("Dear ").append(jBean.getId()).append(" "); 
       html.append("Thank you for your order. Your transaction reference is: <strong>"); 
       html.append(jBean.getKey()).append("</strong>"); 
       html.append("");*/ 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return message; 
     //return html; 
    } 

} 

回答

1

<response></response>標記的含義,無論你放在哪裏,都會被放入你的http:inbound-endpoint響應中。由於smtp是異步的,它在響應階段將被忽略,並且該塊將返回從您的自定義轉換器獲得的任何內容。

解決方法是將<response></response>塊內的內容移動到<async></async>塊中,以便您的自定義轉換器不會干擾http響應。在<response></response>塊內,您只需要一個<object-to-string-transformer>即可將http:outbound-endpoint轉換爲字符串。

編輯:

移動的<object-to-string-transformer>http:outbound-endpoint後,改變你的變壓器採取字符串,而不是輸入流。否則,一旦兩個閱讀器中的任何一個讀取它,輸入流就會被關閉。此後您將不需要0​​。

+0

感謝您的快速回應,我改變了我的流量,按您的建議,並充分利用HTTP,但SMTP我得到一個空的郵件看起來像定製變壓器可以讀取輸入流,這是closedObject前的JSON響應transform:[email protected] org.mule.api.transformer.TransformerException:無法讀取InputStream。 \t在org.mule.transformer.simple.ObjectToString.createStringFromInputStream(ObjectToString.java:87) \t在org.mule.transformer.simple.ObjectToString.doTransform(ObjectToString.java:58) – hpandalai

+0

對不起,是我不好。您無法兩次讀取相同的流。更新了答案。 –

0

你的要求是什麼騾子請求者模塊是基於:

http://java.dzone.com/articles/introducing-mule-requester

示例項目:https://github.com/mulesoft/mule-module-requester

這個模塊可以讓你以異步方式做兩件事情。

希望這有助於

+0

謝謝穆賈德。我們的要求是HTTP出站(請求/響應)是實時SMTP是異步的。這是否符合法案?我相信這個要求相當普遍。 – hpandalai

+0

這種情況與通過網絡發送的訂單非常相似,請求者立即看到http響應(請求/響應),並且響應以電子郵件發送(異步)。 – hpandalai

+0

好吧,聽起來可能,雖然我沒有嘗試與http端點。我做了類似的事情,只是用jms和async讀取sftp位置的一種方法。 – Mujahed