功能: 将某个文件放入特定的目录里(本demo是放入e:/temp目录), 然后将该文件上传到FTP上, 并且发送电子邮件通知文件已经上传
-------------------------------------------------第一步----------------------------------------------------------------------
首先写配制文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mule-configuration PUBLIC "-//MuleSource //DTD mule-configuration XML V1.0//EN"
"http://mule.mulesource.org/dtds/mule-configuration.dtd">
<mule-configuration id="ftp-upload" version="1.0">
<description>File upload via FTP</description>
<connector name="myFileConnector" className="org.mule.providers.file.FileConnector">
<properties>
<!-- property name="moveToDirectory" value="ftp://wuda:wuda@172.16.0.34/temp/" /-->
<property name="moveToPattern" value="${SYSTIME}_${ORIGINALNAME}" />
</properties>
</connector>
<connector name="EmailConnector" className="org.mule.providers.email.SmtpConnector">
<properties>
<property name="fromAddress" value="wuda@localhost" />
<property name="hostname" value="localhost" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="subject" value="file Received!" />
</properties>
</connector>
<connector name="myFTPConnector" className="org.mule.providers.ftp.FtpConnector">
<properties>
<property name="pollingFrequency" value="1000" />
<property name="filenameParser" value="${SYSTIME}_${ORIGINALNAME}.txt" />
</properties>
</connector>
<endpoint-identifiers>
<endpoint-identifier name="ServiceInbound" value="file:///e:/temp" />
<endpoint-identifier name="ToSmtpServer" value="smtp://localhost?address=wuda@localhost" />
<endpoint-identifier name="fileupload" value="ftp://wuda:wuda@172.16.0.34/~/upload" />
</endpoint-identifiers>
<transformers>
<transformer name="sendMail" className="transformer.SendMail"
returnClass="java.lang.String"/>
<transformer name="stringToEmailMessage" className="org.mule.providers.email.transformers.StringToEmailMessage"
returnClass="javax.mail.Message"/>
</transformers>
<!--
The Mule model initialises and manages your UMO components
-->
<model name="file-smtp">
<mule-descriptor name="SmtpNotification" implementation="service.FtpUpload">
<inbound-router>
<endpoint address="ServiceInbound" />
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.MulticastingRouter">
<endpoint address="ftp://wuda:wuda@172.16.0.34/~" >
<properties>
<property name="outputPattern" value="${ORIGINALNAME}"/>
</properties>
</endpoint>
<endpoint address="ToSmtpServer" transformers="sendMail stringToEmailMessage"/>
</router>
</outbound-router>
</mule-descriptor>
</model>
</mule-configuration>
这里需要对这段配制进行一些说明:
<outbound-router>
<router className="org.mule.routing.outbound.MulticastingRouter">
<endpoint address="ftp://wuda:wuda@172.16.0.34/~" >
<properties>
<property name="outputPattern" value="${ORIGINALNAME}"/>
</properties>
</endpoint>
<endpoint address="ToSmtpServer" transformers="sendMail stringToEmailMessage"/>
</router>
</outbound-router>
这里采用MulticastingRouter的方法,来实现发送到多个endpoint, 第一个是实现将文件写到FTP, 第二个是实现电子邮件的发送
-------------------------------------------------第二步----------------------------------------------------------------------
service.FtpUpload文件
package service;
import java.util.HashMap;
import java.util.Map;
import org.mule.umo.UMOEventContext;
import org.mule.umo.UMOMessage;
import org.mule.umo.lifecycle.Callable;
public class FtpUpload implements Callable {
public Object onCall(UMOEventContext eventContext) throws Exception {
UMOMessage message = eventContext.getMessage();
//获取文件名
String fileName =message.getProperty("originalFilename").toString();
byte[] buf = message.getAdapter().getPayloadAsBytes();
return buf;
}
}
这个类是对e:/temp目录的监听,一旦有文件到达该目录后,就会将这个文件以byte[]的形式放入UMOMessage里
-------------------------------------------------第三步----------------------------------------------------------------------
transformer.SendMail文件
package transformer;
import org.mule.impl.RequestContext;
import org.mule.transformers.AbstractTransformer;
import org.mule.umo.UMOEventContext;
import org.mule.umo.UMOMessage;
import org.mule.umo.transformer.TransformerException;
public class SendMail extends AbstractTransformer {
public SendMail(){
super();
// this.registerSourceType(byte.class);
}
@Override
protected Object doTransform(Object src, String encoding)
throws TransformerException {
UMOEventContext eventContext= RequestContext.getEventContext();
UMOMessage message = eventContext.getMessage();
String fileName =message.getProperty("originalFilename").toString();
return "you have received a email named "+fileName;
}
}
注意:
1. 这个类并不是实现转换目的,而是实现构造电子邮件内容的功能
2. 这个类返回的是String类型, 但是smtp要求被发送的邮件是javax.mail.Message, 所以还要进行一个转换--stringToEmailMessage它使用了mule本身的org.mule.providers.email.transformers.StringToEmailMessage类
3. 这样写是不支持中文的,因为mule本身是用ISO-8859-1, 所以还得做相应的调整,这将会在以下的详解中提到
-------------------------------------------------第三步----------------------------------------------------------------------
写一个main函数, 这个主要的作用是方便调试
public static void main(String[] args) throws Exception {
String rootPath = System.getProperty("user.dir");
String filePath = rootPath +"//conf//mule-ftp-upload-configl.xml";
MuleXmlConfigurationBuilder builder = new MuleXmlConfigurationBuilder();
builder.configure(filePath);
}
下面就可以调试了.
-------------------------------------------------完成--------------------------------------------------------------------------