Mule 在一封邮件中从入站文件连接器发送多个文件

Mule 在一封邮件中从入站文件连接器发送多个文件,mule,mule-studio,mule-el,Mule,Mule Studio,Mule El,我似乎不知道如何才能实现以下目标: 1 Mule需要从目录中提取文件并将其放在ftp上。此部件正在工作 2接下来,它需要在一封邮件中邮寄上传的文件,邮件正文提到上传文件的文件名 =>第二部分我不明白如何使用mule块来实现这一点。我尝试使用不同的属性作用域将文件名保存在列表中,但每次我到达聚合器块时,所有属性都消失了,包括会话属性。虽然文件是聚合的,但我也需要文件名 我是不是漏掉了什么明显的东西?谢谢 以下是我的xml: <flow name="KCM-FTP" doc:name="KCM

我似乎不知道如何才能实现以下目标:

1 Mule需要从目录中提取文件并将其放在ftp上。此部件正在工作

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

=>第二部分我不明白如何使用mule块来实现这一点。我尝试使用不同的属性作用域将文件名保存在列表中,但每次我到达聚合器块时,所有属性都消失了,包括会话属性。虽然文件是聚合的,但我也需要文件名

我是不是漏掉了什么明显的东西?谢谢

以下是我的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>

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

我通过实现一个小型Java类自己解决了这个问题。显然消息属性并没有丢失,您只是在调试器中再也看不到它们了,因为调试器只显示来自聚合器的messageCollection的属性

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

流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>
} }

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;