我想做一个流程:
我怎样才能提出第一点?
答案 0 :(得分:2)
您可以根据他们的"基本名称"来汇总这些文件。 (即获取没有扩展名的文件名),然后处理聚合集中的每个文件。
可以使用Collection-Aggregator或Custom-Aggregator执行聚合,这里是每个聚合的示例:
使用Collection-Aggregator:
<flow name="two-files-per-process-with-collection-aggregator">
<file:inbound-endpoint path="/file-in" moveToDirectory="/file-in-process" responseTimeout="10000" doc:name="Read files" >
<file:filename-regex-filter pattern=".*\.aaa|.*\.bbb" caseSensitive="true"/>
</file:inbound-endpoint>
<set-property propertyName="MULE_CORRELATION_ID" value="#[message.inboundProperties.originalFilename.substring(0,message.inboundProperties.originalFilename.lastIndexOf('.'))]" doc:name="Set Correlation-Id"/>
<set-property propertyName="MULE_CORRELATION_GROUP_SIZE" value="2" doc:name="Set Correlation-Group-Size"/>
<collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/>
<foreach doc:name="For Each">
<logger message="#[message.inboundProperties.originalFilename]" level="INFO" doc:name="Some process"/>
</foreach>
</flow>
使用Custom-Aggregator(您需要一个自定义的java类):
<flow name="two-files-per-process-with-custom-aggregator">
<file:inbound-endpoint path="/file-in" moveToDirectory="/file-in-process" responseTimeout="10000" doc:name="Read files">
<file:filename-regex-filter pattern=".*\.aaa|.*\.bbb" caseSensitive="true"/>
</file:inbound-endpoint>
<custom-aggregator failOnTimeout="true" class="org.mnc.MatchFileNames" doc:name="Custom Aggregator"/>
<foreach doc:name="For Each">
<logger message="#[message.inboundProperties.originalFilename]" level="INFO" doc:name="Some process"/>
</foreach>
</flow>
这是自定义聚合器的一种可能实现(它可能更优雅:
package org.mnc;
import org.mule.api.MuleContext;
import org.mule.api.MuleEvent;
import org.mule.api.routing.RoutingException;
import org.mule.routing.AbstractAggregator;
import org.mule.routing.EventGroup;
import org.mule.routing.correlation.EventCorrelatorCallback;
public class MatchFileNames extends AbstractAggregator {
@Override
protected EventCorrelatorCallback getCorrelatorCallback(final MuleContext muleContext) {
return new EventCorrelatorCallback() {
@Override
public boolean shouldAggregateEvents(EventGroup events) {
return events.size()==2;
}
@Override
public EventGroup createEventGroup(MuleEvent event, Object id) {
String filename = event.getMessage().getInboundProperty("originalFilename");
String commonFilename = filename.substring(0, filename.lastIndexOf('.'));
System.out.println(filename + " -> " + commonFilename);
return new EventGroup(commonFilename, muleContext, 2, true, storePrefix);
}
@Override
public MuleEvent aggregateEvents(EventGroup events) throws RoutingException {
return events.getMessageCollectionEvent();
}
};
}
}
答案 1 :(得分:0)
使用石英组件 - 以所需的间隔触发流量。在这里阅读更多相关信息: http://www.mulesoft.org/documentation/display/current/Quartz+Transport+Reference
触发时 - 编写比较两个目录并在两者之间找到文件对的Java代码。
在我的脑海中,我不确定是否有办法动态设置入站文件过滤器。 否则 - 人们总是可以用Java处理整个过程;读取文件,转换为字节数组,最后将消息传播到groovy脚本。
答案 2 :(得分:0)
您可以拥有两个文件入站端点,每个文件对应一个等待的文件。当您的流读取文件时,它会将文件复制到另一个目录。如果另一个文件已经处理并移动到目录(您可以使用Object Store中的变量跟踪它),则使用name.ready进行保存并将之前移动的文件移动到name2.ready。
您有第三个流,其中包含使用* .ready通配符模式从该目录读取的文件入站端点。然后使用Requester Module将另一个文件加载到变量中。