mule in action翻译14 : 3.2 使用文件传输
读写文件是应用程序获取或写出数据最常用的方式。
本节学习如何使用mule的文件传输实现读、写、移动、删除的操作。
配置属性 本书中你会看到如下的属性配置:
host="${imap.host}"
这些属性占位符是为了避免硬编码。属性文件的位置的配置如下:
<context:property-placeholder location="/mule.properties"/>
文件传输的一些配置属性如表 3.1 所示。
一些Prancing Donkey公司的员工还在使用Excel记录支出。这对公司的公司的开发人员是个 特别沮丧的事情,他们本想享受Arnor Accounting REST风格 API带来便利。但更糟糕的是, 员工一直是把报销单电邮到会计部门。 会计部门人员则疲于过滤邮件中的报销单附件, 找到这些报销单后还要放到一个网络共享目录。此外还有一个问题,报销单命名并不统一。
我们来看一个流,它可以轮询接受报销单的文件夹,并会把不符合命名规范的报销单复制到另外
一个文件夹。见图 3.5
Listing 3.1 Using the file transport to move files from one directory to another
<flow name="copyExpenseReports"> <--!注释1 每分钟一次轮询文件夹 ./data/expenses/1/in 查找新文件--> <file:inbound-endpoint path="./data/expenses/1/in" pollingFrequency="60000"> <--!注释2 只接受后缀是 .xls扩展名的文件--> <file:filename-regex-filter pattern=".*xls$" caseSensitive="false"/> </file:inbound-endpoint> <--!注释3 把文件写到/data/expenses/out 把新文件命名为时间戳加上原文件名--> <file:outbound-endpoint path="./data/expenses/out" outputPattern="EXPENSE-REPORT- #[org.mule.util.DateUtils.getTimeStamp('dd-MM-yy_HH-mm-ss.SSS')] -#[inboundProperties['originalFilename']]"/> </flow>
这个流的消息源是一个 文件 inbound endpoint ,
注释1处是轮询文件夹 /data/expenses/1/in以发现新文件,频率是每分钟一次。
注释2处 定义了一个filename-regex-filter,指定endpoint只接收后缀名为.xml 的文件,并会忽略大小写。
注释3处,outbound endpoint 格式化文件名为时间戳加上原文件名。
为了得到后者你引用了originalFilename--这是由inbound endpoint填充进去的。
默认情况下,一个文件inbound endpoint向outbound endpoint传送文件时会在源文件夹把文件剪切掉。
可以通过设置文件 连接器的 autoDelete属性为false来改变这种默认行为。
但要小心,这回导致inbound endpoint 重复读取文件,直至文件被从源文件夹总删掉。
fileAge参数允许你读取文件存在时长超过某毫秒的文件。例如 设置为 5000 ,将导致文件inbound endpoint只处理 文件存在时长超过5分钟的文件。
多个mule节点轮询同一个共享文件系统
第8章你将看到 把同一个mule应用部署到多个mule实例中。这种场景下必须要小心,需要协调多个节点的
状态,避免发生同时读、删、移动文件。 mule企业版的的集群功能将会自动的协调和分散开mule应用对
文件传输的使用。