Mule文件入站流程:控制线程数

时间:2014-06-10 11:20:28

标签: mule

我想控制文件入站和消息处理器中的线程数。假设我的输入目录中有5个文件,那么我应该能够一次处理2个文件。一旦这些文件被处理(文件内容由消息处理器处理),那么它应该拿起其他文件。我曾尝试在流级别使用同步处理策略,但它只处理一个文件,我想要多个线程,但每个线程将直接从接收文件处理消息以发送响应。我尝试了大卫建议的方法,但它也没有用。一次只能获取一个文件。

<flow name="fileInboundTestFlow2" doc:name="fileInboundTestFlow2" processingStrategy="synchronous">
    <poll frequency="1000">
        <component class="FilePollerComponent" doc:name="File Poller"></component>
    </poll>
    <collection-splitter />
    <request-reply >
            <vm:outbound-endpoint path="out"/>
            <vm:inbound-endpoint path="response">
                               <collection-aggregator/>
            </vm:inbound-endpoint>                      
    </request-reply>
    <file:outbound-endpoint path="E:/fileTest/processed" />
</flow>

public class FilePollerComponent implements Callable{

private String pollDir="E://fileTest" ;

private int numberOfFiles = 3;

public String getPollDir()
{
    return pollDir;
}

public void setPollDir(String pollDir)
{
    this.pollDir = pollDir;
}



public int getNumberOfFiles()
{
    return numberOfFiles;
}

public void setNumberOfFiles(int numberOfFiles)
{
    this.numberOfFiles = numberOfFiles;
}

@Override
public Object onCall(MuleEventContext eventContext) throws Exception
{
    File f = new File(pollDir);
    List<File> filesToReturn = new ArrayList<File>(numberOfFiles);
    if(f.isDirectory())
    {
        File[] files = f.listFiles();
        int i = 0;
        for(File file : files)
        {
            if(file.isFile())
                filesToReturn.add(file);
            if(i==numberOfFiles)
                break ;
            i++;
        }
    }
    else
    {
        throw new Exception("Invalid Directory");
    }
    return filesToReturn;
}}

1 个答案:

答案 0 :(得分:3)

文件入站端点是一个轮询器,因此它使用一个线程。如果您使流程同步,那么您将捎带此单个线程,从而一次处理一个文件。

您需要创建仅允许2个线程的流处理策略。使用以下允许500个线程的示例:http://www.mulesoft.org/documentation/display/current/Flow+Processing+Strategies#FlowProcessingStrategies-Fine-TuningaQueued-AsynchronousProcessingStrategy

编辑:上述提案无法满足此要求:

  

如果我配置3个线程,那么将从输入目录中选取三个文件,直到这些文件被处理,不应该选择其他文件

实际上,上述提案将始终并行处理3个文件,而不是以3个为一组进行处理。

所以我提出了这种替代方法:

  • 将流处理策略配置为同步
  • 使用poll元素作为来源
  • 在其中放置一个自定义组件,从可配置目录中选择3个不同的文件。无需锁定任何东西,因为流程的同步策略阻止了重新进入。返回java.util.List java.io.File s。
  • 在其后添加collection-splitter
  • 在入站端点中添加request-reply aggregator以实现fork-join模式(http://blogs.mulesoft.org/aggregation-with-mule-fork-and-join-pattern/)。文件处理将在另一个流程中进行,而轮询流程将阻止,直到所有3个文件都已处理完毕。