Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mule 多重反应_Mule_Esb - Fatal编程技术网

Mule 多重反应

Mule 多重反应,mule,esb,Mule,Esb,我需要从mule流发送多个响应,一个发送到http端点(将是JSON),另一个发送到SMTP端点,收件人在该端点接收自定义电子邮件。如果使用转换器转换json响应(默认情况下),两个端点都会接收相同的自定义电子邮件格式。那么,我如何将默认JSON响应发送到http端点,而下面的自定义转换器生成的电子邮件是我的流和自定义转换器 <?xml version="1.0" encoding="UTF-8"?> <mule xmlns:smtp="http://www.mulesoft

我需要从mule流发送多个响应,一个发送到http端点(将是JSON),另一个发送到SMTP端点,收件人在该端点接收自定义电子邮件。如果使用转换器转换json响应(默认情况下),两个端点都会接收相同的自定义电子邮件格式。那么,我如何将默认JSON响应发送到http端点,而下面的自定义转换器生成的电子邮件是我的流和自定义转换器

<?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>
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;
    }

}

自定义变压器

<?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>
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;
    }

}
package org.xxx.transformer;
导入org.apache.log4j.Logger;
导入org.xxx.dto.JsonBean;
导入org.mule.api.MuleMessage;
导入org.mule.api.transformer.TransformerException;
导入org.mule.transformer.AbstractMessageTransformer;
导入java.util.HashMap;
导入java.util.Map;
导入org.codehaus.jackson.map.ObjectMapper;
导入org.codehaus.jackson.type.TypeReference;
公共类EmailBodyTransformer扩展了AbstractMessageTransformer{
公共静态记录器Logger=Logger.getLogger(EmailBodyTransformer.class);
@凌驾
公共对象转换消息(多消息消息、字符串输出编码)
抛出TransformerException{
//TODO自动生成的方法存根
StringBuffer html=新的StringBuffer();
Map Map=newhashmap();
ObjectMapper mapper=新的ObjectMapper();
JsonBean jBean=新的JsonBean();
试一试{
logger.debug(“EmailBodyTransformer有效负载”
+message.getPayloadAsString());
debug(“EmailBodyTransformer类”+message.getClass());
map=mapper.readValue(message.getPayloadAsString(),
新类型引用(){});
jBean.setId(map.get(“id”));
jBean.setKey(map.get(“key”);
jBean.setSelf(map.get(“self”);
System.out.println(“来自映射的EmailBodyTransformer id:+jBean.getId());
System.out.println(“EmailBodyTransformer映射:“+map”);
/*html.append(“”);
html.append(“”);
html.append(“”);
html.append(“亲爱的”).append(jBean.getId()).append(“”);
html.append(“感谢您的订单。您的交易参考是:”;
append(jBean.getKey()).append(“”);
html.append(“”)*/
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回消息;
//返回html;
}
}
标签的意思是,您在那里输入的任何内容都将被输入到您的
http:inbound endpoint
响应中。由于smtp是异步的,它将在响应阶段被忽略,并且块将返回它从自定义转换器获得的任何内容

解决方案是将
块中的内容移动到
块中,这样您的自定义转换器就不会干扰http响应。在
块中,您只需要一个
就可以将
http:outbound端点
转换为字符串

编辑:


移动到
http:outbound端点之后,并将转换器更改为获取字符串,而不是输入流。否则,一旦两个读卡器中的任何一个读取了输入流,输入流就会关闭。在此之后,您将不需要

您的需求正是mule请求者模块所基于的:

示例项目:

此模块允许您异步执行两件事情


希望这有帮助

感谢您的快速响应,我根据您的建议更改了我的流,并从HTTP获得JSON响应,但smtp我收到一封空电子邮件,看起来自定义转换器可以读取输入流,该输入流在转换之前关闭。对象:org.mule.transport.HTTP。ReleasingInputStream@684be8b8 org.mule.api.transformer.TransformerException:无法读取InputStream。在org.mule.transformer.simple.ObjectToString.createStringFromInputStream(ObjectToString.java:87)在org.mule.transformer.simple.ObjectToString.doTransform(ObjectToString.java:58)对不起,我的错。同一个流不能读取两次。更新了答案。感谢圣战者。我们的要求是http出站(请求/响应)是实时的SMTP是异步的。这个合适吗。我确信这一要求相当普遍。这种情况非常类似于通过web下订单。请求者立即看到http响应(请求/响应),并且响应以电子邮件的形式发送(异步)。虽然我没有尝试使用http端点,但听起来是可能的。我做了一些类似的事情,只是用jms和异步读取sftp位置的一种方法。