Mule ESB:文件输出模式不会转换模式

时间:2014-03-17 23:46:14

标签: mule mule-studio mule-el

我使用的是Mule ESB CE 3.4。我有一个要求,即我从数据库中读取配置信息并将其用作文件出站端点的文件名。这是一个示例代码(代码可能不起作用,因为我只给出了一个大纲)

<file:connector name="File-Data" autoDelete="false" streaming="true" validateConnections="true" doc:name="File" />
.....
<!-- Gets the configuration from database using a transformer. The transformer populates the configuration entries in a POJO and puts that in a session.  -->
<custom-transformer  class="com.test.DbGetConfigsTransformer" doc:name="Get Integration Configs"/>
....<!-- some code to process data -->
<logger message="$$$: #[sessionVars['currentFeed'].getFilePattern()]" doc:name="Set JSON File Name" /> -->
<file:outbound-endpoint path="/temp" outputPattern="#[sessionVars['currentFeed'].getFilePattern()]" responseTimeout="10000" mimeType="text/plain" connector-ref="File-Data" doc:name="Save File"/>

上面的代码会引发以下错误:

1. The filename, directory name, or volume label syntax is incorrect (java.io.IOException)
  java.io.WinNTFileSystem:-2 (null)
2. Unable to create a canonical file for /temp/Test_User_#[function:datestamp:YYYYMMddhhmmss.sss] (org.mule.api.MuleRuntimeException)
  org.mule.util.FileUtils:354 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MuleRuntimeException.html)
3. Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=file:///temp, connector=FileConnector

在数据库表中,字段名称称为FilePattern,其值为&#39; Test_User _#[function:datestamp:YYYYMMddhhmmss.sss]。如果我对值进行硬编码或将此值移动到mule配置文件

file.name=Test_User_#[function:datestamp:YYYYMMddhhmmss.sss]

并使用配置属性语法(例如&#39; outputpattern&#39;中的$ {file.name}),它可以正常工作。但是,如果我从数据库中读取相同内容并使用它,它就无法正常工作并抛出错误。记录器显示为(从数据库中读取)

$$$: Test_#[function:datestamp:YYYYMMddhhmmss.sss]    

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

如果你的日期戳格式没有变化,你应该只在你的数据库中存储环境前缀并使用类似的东西:

outputPattern="#[sessionVars['prefix']+server.dateTime.format('YYYYMMddhhmmss.sss')]"

如果需要使用当前的数据库值,可以使用基本的Java字符串方法来查找正确的子字符串。例如:

#[sessionVars['currentFeed'].getFilePattern().substring(0,sessionVars['currentFeed'].getFilePattern().indexOf('function')-2)+server.dateTime.format('YYYYMMddhhmmss.sss')]

如果使用不同的日期戳格式,您也可以使用类似的String方法找到该部分。但是,我仍然建议你提出一个只在db。中存储环境前缀的实现。