首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mule多重响应

Mule多重响应
EN

Stack Overflow用户
提问于 2014-02-17 19:19:15
回答 2查看 1.6K关注 0票数 0

我需要从mule流发送多个响应,一个发送到http端点,另一个发送到SMTP端点,接收者在那里接收自定义电子邮件。如果我使用一个转换器来转换json响应,这是默认的,两个端点都会收到相同的自定义电子邮件格式。那么,如何将默认的JSON响应发送到http端点,并将Custom Transformer生成的电子邮件发送到smtp端点?下面是我的流和自定义转换器

代码语言:javascript
复制
<?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="pandalai@gmail.com" 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>

自定义Transformer

代码语言:javascript
复制
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;
    }

}
EN

回答 2

Stack Overflow用户

发布于 2014-02-17 20:09:55

<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之后,并将您的转换器更改为接受字符串,而不是输入流。否则,一旦两个读取器中的任何一个读取输入流,输入流就会关闭。在此之后,您将不再需要<response></response>

票数 1
EN

Stack Overflow用户

发布于 2014-02-18 22:09:25

您的需求正是mule-requester-module所基于的:

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

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

这个模块允许你异步地做两件事。

希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21827658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档