2014-02-17 2 views
0

노새 흐름 1에서 JSON이 될 HTTP 종점과 수신자가 사용자 지정 전자 메일을받는 SMTP 종점에 대해 여러 응답을 보내야합니다. 트랜스 포머를 사용하여 기본값 인 json respone을 변환하는 경우 두 종단점 모두 동일한 사용자 정의 전자 메일 형식을받습니다. 그래서는 HTTP 엔드 포인트 및 사용자 정의 변압기에 기본 JSON 응답을 보낼 수있는 방법을 생성 된 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> 블록 안에 http:outbound-endpoint을 문자열로 변환하려면 <object-to-string-transformer> 만 있으면됩니다.

편집 :

이동하여 http:outbound-endpoint<object-to-string-transformer>와 문자열이 아닌 입력 스트림을 위해 변압기를 변경합니다. 그 이외의 경우는, 2 개의 리더의 어느 쪽이든을 읽으면, 입력 스트림은 닫혀집니다. 이 후에 <response></response>이 필요하지 않습니다.

+0

감사를하는 데 도움이 변형 : [email protected] org.mule.api.transformer.TransformerException : InputStream을 읽을 수 없습니다. org.mule.transformer.simple.ObjectToString.doTransform에서 org.mule.transformer.simple.ObjectToString.createStringFromInputStream (ObjectToString.java:87) \t (ObjectToString.java:58)에서 \t – hpandalai

+0

죄송합니다, 내 나쁜. 같은 스트림을 두 번 읽을 수 없습니다. 답변을 업데이트했습니다. –

0

귀하의 요구 사항은 노새 요청 모듈을 기반으로 정확히 :

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

예제 프로젝트 : https://github.com/mulesoft/mule-module-requester

이 모듈은 당신이 두 가지를 비동기 적으로 작업을 수행 할 수 있습니다.

희망이 내가 당신의 제안 당 및 SMTP 나는 빈 이메일 전에 closedObject입니다 입력 스트림을 읽을 수있는 사용자 정의 변압기처럼 보이는 얻을 HTTP 만에서 JSON 응답을 얻기로 내 흐름을 변경 빠른 응답

+0

감사합니다. Mujahed. 우리의 요구 사항은 HTTP 아웃 바운드 (요청/응답)입니다 실시간 SMTP는 비동기입니다. 이것이 법안에 해당됩니까? 이 요구 사항이 매우 일반적이라고 확신합니다. – hpandalai

+0

사례는 웹을 통해 배치되는 주문과 매우 유사하며 요청자가 http 응답을 즉각적으로보고 (요청/응답) 응답을 전자 메일 (async)로 보냅니다. – hpandalai

+0

글쎄, 가능한 소리, 비록 내가 http 엔드 포인트와 함께 시도하지 않았다. 비슷한 일을했지만 jms와 비동기로 한 가지 방법으로 sftp 위치를 읽었습니다. – Mujahed