在单个邮件中从入站文件连接器邮寄多个文件

时间:2015-04-27 15:12:16

标签: mule mule-studio mule-el

我似乎无法弄清楚如何实现以下目标:

1)Mule需要从目录中获取文件并将其放在ftp上(此部分正在运行)

2)接下来,它需要邮寄在一封邮件中上传的文件,邮件正文中提到了上传文件的文件名。

=>第二部分我不明白如何使用骡子块来做到这一点。我尝试使用不同的属性范围来保存列表中的文件名,但每次进入聚合器块时,我的所有属性都消失了(包括会话属性)。虽然文件是聚合的,但我也需要文件名。

我错过了一些明显的东西吗?谢谢!

这是我的xml:

<flow name="KCM-FTP" doc:name="KCM-FTP"> 
    <file:inbound-endpoint responseTimeout="10000" doc:name="File" path="${path.kcm.uploadfolder}"></file:inbound-endpoint>
    <message-properties-transformer doc:name="Message Properties">
        <add-message-property key="MULE_CORRELATION_ID" value="1"/>
        <add-message-property key="MULE_CORRELATION_GROUP_SIZE" value="100"/>
    </message-properties-transformer>

    <ftp:outbound-endpoint host="${ftp.host}" port="${ftp.port}" path="${path.ftp.inputfolder}" user="${ftp.username}" password="${ftp.password}" responseTimeout="10000" doc:name="FTP"></ftp:outbound-endpoint>  
    <collection-aggregator timeout="15000" failOnTimeout="false" doc:name="Collection Aggregator"></collection-aggregator>  
    <message-properties-transformer doc:name="Message Properties"> 
        <add-message-property key="EmailHeader" value="#['KCM uploader \n Run: ' +server.dateTime + '\n\nFiles uploaded:\n']"></add-message-property>  
    </message-properties-transformer>
    <foreach doc:name="For Each">
        <set-attachment attachmentName="test" value="#[payload]" contentType="text/plain" doc:name="Attachment"/>
    </foreach>

    <smtp:outbound-endpoint host="${smtp.host}" port="${smtp.port}" to="${mail.to}" subject="${mail.subject}" responseTimeout="10000" doc:name="SMTP" from="${mail.from}"></smtp:outbound-endpoint>  
</flow>

2 个答案:

答案 0 :(得分:0)

对于文件入站端点找到的每个文件,您的流程将运行一次。除非您将所有文件存储在其他位置,否则您无法在同一封电子邮件中将所有文件一起发送。但是......你怎么知道你读完所有文件?什么时候开始执行流程?您可以使用HTTP侦听器触发流,然后使用Java组件获取所有可用文件。

答案 1 :(得分:0)

我能够通过实现一个小的java类来解决它。显然,消息属性没有丢失,您再也无法在调试器中看到它们,因为调试器只显示聚合器发出的messageCollection的属性。

我的流程只需要运行1次/小时+文件数量不超过100 /小时,因此我的简单聚合器在1分钟后超时,以确定没有更多文件需要处理。

Flow xml:

<file:connector name="File" autoDelete="true" streaming="false" validateConnections="true" doc:name="File"/>
<flow name="KCM-FTP" doc:name="KCM-FTP"> 
    <file:inbound-endpoint responseTimeout="10000" doc:name="File" path="${path.kcm.uploadfolder}" ></file:inbound-endpoint>
    <message-properties-transformer doc:name="Set Aggregation Properties">
        <add-message-property key="MULE_CORRELATION_ID" value="1"/>
        <add-message-property key="MULE_CORRELATION_GROUP_SIZE" value="100"/>
    </message-properties-transformer>
    <ftp:outbound-endpoint host="${ftp.host}" port="${ftp.port}" path="${path.ftp.inputfolder}" user="${ftp.username}" password="${ftp.password}" responseTimeout="10000" doc:name="FTP"/>
    <collection-aggregator timeout="15000" failOnTimeout="false" doc:name="Collection Aggregator"/>
    <message-properties-transformer doc:name="Set Email Header">
        <add-message-property key="EmailHeader" value="#['KCM uploader \n Run: ' +server.dateTime + '\n\nFiles uploaded:\n']"/>
    </message-properties-transformer>
    <custom-transformer class="com.company.kcm.Transformer.FileParser" doc:name="Add mail attachments"/>
    <smtp:outbound-endpoint host="${smtp.host}" port="${smtp.port}" to="${mail.to}" from="${mail.from}"  subject="${mail.subject}" responseTimeout="10000" doc:name="SMTP"/>

</flow>

Java转换器实现:

public class FileParser extends AbstractMessageTransformer implements Transformer {

private String body;

@Override   
public Object transformMessage(MuleMessage src, String outputEncoding) throws TransformerException {        

    try {

        if(src instanceof MuleMessageCollection) {
            MuleMessageCollection messageCollection = (MuleMessageCollection)src;

            MuleMessage[] messagesAsArray = messageCollection.getMessagesAsArray();
            body = messageCollection.getOutboundProperty("EmailHeader").toString();

            //Add all input files as email attachments
            for (MuleMessage muleMessage : messagesAsArray) {

                messageCollection.addOutboundAttachment((String) muleMessage.getInboundProperty("originalFilename"), muleMessage.getPayload(),"text/plain");

                body += (String) muleMessage.getInboundProperty("originalFilename") + "\n";
            }

        }


    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }

    return body;

} }