我似乎无法弄清楚如何实现以下目标:
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>
答案 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;
} }