2015-04-27 103 views
0

我似乎无法弄清楚如何能够做到以下几点:邮件在一个邮件从入站文件连接多个文件

1)骡子需要从目录拿起文件,并把它放在一个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> 

回答

0

我能够通过实现一个小的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> 

的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; 

}}

0

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