功能: 对远端FTP目录进行监听, 一旦有文件放入该目录, 下载该文件, 并且删除FTP目录的这个文件, 然后发送email文件告知文件已经下载
-------------------------------------------------第一步----------------------------------------------------------------------
首先写配制文件
<?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" version="1.0">
<description>send file to and receive file from ftp</description>
<connector name="myFTPConnector" className="org.mule.providers.ftp.FtpConnector">
<properties>
<property name="pollingFrequency" value="1000" />
<property name="filenameParser" value="${SYSTIME}_${ORIGINALNAME}" />
</properties>
</connector>
<connector name="myEmailConnector" className="org.mule.providers.email.SmtpConnector">
<properties>
<property name="fromAddress" value="zbq@localhost" />
<property name="hostname" value="localhost" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="subject" value="file Received!" />
</properties>
</connector>
<endpoint-identifiers>
<endpoint-identifier name="ServiceInbound" value="ftp://wuda:wuda@172.16.0.34/~" />
<endpoint-identifier name="ToSmtpServer" value="smtp://localhost?address=wuda@localhost" />
</endpoint-identifiers>
<!--
The Mule model initialises and manages your UMO components
-->
<model name="ftp-demo">
<mule-descriptor name="FtpNotification" implementation="service.Ftp">
<inbound-router>
<endpoint address="ServiceInbound">
</endpoint>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<endpoint address="ToSmtpServer" />
</router>
</outbound-router>
<properties>
<property name="emailTextFile" value="email.txt" />
</properties>
</mule-descriptor>
</model>
</mule-configuration>
在里注意几点:
1. <property name="emailTextFile" value="email.txt" /> 这里存放的是要发送电子邮件 的内容, 这个文件应该存放在项目的根目录
2. FTPconnector 和 SmtpConnector的配制可以参见mule-1.3.2说明文档
3. 在这里需要创建FTP服务器和邮件服务器, 这里我使用serv-u 和 james来分别创建ftp和电子邮件服务器
-------------------------------------------------第二步----------------------------------------------------------------------
下面写service.Ftp文件
package service;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.mule.umo.UMOEventContext;
import org.mule.umo.UMOMessage;
import org.mule.umo.lifecycle.Callable;
import org.mule.util.TemplateParser;
public class Ftp implements Callable {
private String emailTextFile;
private TemplateParser parser = TemplateParser.createAntStyleParser();
private String emailText;
public Object onCall(UMOEventContext eventContext) throws Exception {
UMOMessage message = eventContext.getMessage();
Map props = new HashMap();
//获取文件名
String fileName =message.getProperty("originalFilename").toString();
//获得文件
byte[] buf = message.getAdapter().getPayloadAsBytes();
//将文件定到相应目录, 这里就是简单的写到e:盘
FileOutputStream fos = new FileOutputStream("e://"+fileName);
if(buf!=null){
fos.write(buf);
fos.flush();
fos.close();
}
//将email内容里的${filename}替换成存放的文件名
props.put("filename", fileName);
String str = parser.parse(props, emailText);
//返回邮件内容
return str ;
}
private String readFile(String path) throws IOException {
FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr);
String tmp;
String email = "";
while ((tmp = br.readLine()) != null) {
email = email.concat(tmp) + "/r/n";
}
return email;
}
public String getEmailTextFile() {
return this.emailTextFile;
}
public void setEmailTextFile(String emailTextFile) throws IOException {
this.emailTextFile = emailTextFile;
this.emailText = this.readFile(this.emailTextFile);
}
}
这里需要说明了的是:
1. 在mule读取配制文件的时候先初始化这个类, 并且读取第一步配制文件中的<property name="emailTextFile" value="email.txt" />, 然后执行setEmailTextFile(String emailTextFile)方法
2. mule 在读完FTP目录里文件的时候,会删除这个文件的,以下是它的源代码
if (!client.retrieveFile(file.getName(), baos))
{
throw new IOException("Ftp error: " + client.getReplyCode());
}
UMOMessage message = new MuleMessage(connector.getMessageAdapter(baos.toByteArray()));
message.setProperty(FileConnector.PROPERTY_ORIGINAL_FILENAME, file.getName());
routeMessage(message);
if (!client.deleteFile(file.getName()))
{
throw new IOException("Ftp error: " + client.getReplyCode());
}
当然,如果用户没有权限删除FTP上的文件的时候,只是抛出异常,并不会影响程序的执行
3.message.getAdapter().getPayloadAsBytes();这个方法在说明文档里是没有说明的, 是通过源代码得知的.
mule的FTP transport是先读取FTP目录里的文件, 然后以byte[]的形式存放在UMOMessage里, 其实是MuleMessage里,然后返回到继承Callable的那个方法里.
-------------------------------------------------第三步----------------------------------------------------------------------
将email.txt文件放到这个项目的根目录中,它的内容是
${filename}
hello world!
在这个文件里的${filename}是需要特别注意的, 在第二步有段程序
props.put("filename", fileName);
String str = parser.parse(props, emailText);
这里emailText里面就是存放着email.txt文件的内容, parser.parse(props, emaiText)就是将${filename}用fileName这个字串来取代
-------------------------------------------------第四步----------------------------------------------------------------------
写一个main函数, 这个主要的作用是方便调试
public static void main(String[] args) throws Exception {
String rootPath = System.getProperty("user.dir");
String filePath = rootPath +"//conf//mule-ftp-config.xml";
MuleXmlConfigurationBuilder builder = new MuleXmlConfigurationBuilder();
builder.configure(filePath);
}
下面就可以调试了.
-------------------------------------------------完成----------------------------------------------------------------------