用mule实现对远端ftp目录的监听

功能: 对远端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);
 }


下面就可以调试了.
-------------------------------------------------完成----------------------------------------------------------------------

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值