Mule ESB-两个文件作为输入(同时等待)

Mule ESB-两个文件作为输入(同时等待),mule,esb,mule-studio,Mule,Esb,Mule Studio,我想做一个流程,其中: 等待两个文件:file_name.xdf和file_name.dff:如果两个文件(我希望同时处理两个文件(等待两个文件),则这些文件的文件名应相同) 处理这些文件并将其转换为字节数组 运行groovy脚本 如何提出第一点?使用石英元件-以所需的间隔触发流量。请在此处阅读更多信息: 触发时—编写Java代码,比较两个目录并查找两个目录之间的文件对 我不知道是否有办法动态设置入站文件过滤器。 否则——人们可以用Java处理整个过程;读取文件,转换为字节数组,最后将消息传播

我想做一个流程,其中:

  • 等待两个文件:file_name.xdf和file_name.dff:如果两个文件(我希望同时处理两个文件(等待两个文件),则这些文件的文件名应相同)
  • 处理这些文件并将其转换为字节数组
  • 运行groovy脚本

  • 如何提出第一点?

    使用石英元件-以所需的间隔触发流量。请在此处阅读更多信息:

    触发时—编写Java代码,比较两个目录并查找两个目录之间的文件对

    我不知道是否有办法动态设置入站文件过滤器。
    否则——人们可以用Java处理整个过程;读取文件,转换为字节数组,最后将消息传播到groovy脚本。

    您可以有两个文件入站端点,每个端点对应一个等待的文件。当您的流读取文件时,它会将文件复制到其他目录。如果另一个文件已被处理并移动到目录中(您可以使用对象存储中的变量跟踪该文件),则使用name.ready保存,并将先前移动的文件移动到name2.ready


    第三个流具有一个文件入站端点,该端点使用*.ready通配符模式从该目录读取。然后使用将另一个文件加载到变量中。

    您可以根据文件的“基本名称”(即采用不带扩展名的文件名)聚合文件,然后处理聚合集中的每个文件

    可以使用集合聚合器或自定义聚合器执行聚合,以下是每个聚合器的示例:

    使用集合聚合器:

    <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>
    

    我也面临类似的情况。好奇你是怎么解决的我知道这不是一个优雅的解决方案。
    <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();
                }
            };
        }
    }