在一封邮件中从入站文件连接器邮寄多个文件
Mailing multiple files from inbound file connector in a single mail
我似乎无法弄清楚如何实现以下目标:
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>
您的流程将为文件入站端点找到的每个文件 运行 一次。除非您将所有文件存储在其他地方,否则您将无法将所有文件一起发送到同一封电子邮件中。但是……你怎么知道你读完了所有文件?你应该什么时候开始执行流程?您可以使用 HTTP 侦听器触发流程,然后使用 Java 组件获取所有可用文件。
我能够通过实现一个小 java class 自己解决它。显然消息属性并没有丢失,您只是无法再在调试器中看到它们,因为调试器只显示来自聚合器的 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;
}
}
我似乎无法弄清楚如何实现以下目标:
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>
您的流程将为文件入站端点找到的每个文件 运行 一次。除非您将所有文件存储在其他地方,否则您将无法将所有文件一起发送到同一封电子邮件中。但是……你怎么知道你读完了所有文件?你应该什么时候开始执行流程?您可以使用 HTTP 侦听器触发流程,然后使用 Java 组件获取所有可用文件。
我能够通过实现一个小 java class 自己解决它。显然消息属性并没有丢失,您只是无法再在调试器中看到它们,因为调试器只显示来自聚合器的 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;
} }