我想控制文件入站和消息处理器中的线程数。假设我的输入目录中有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;
}}
答案 0 :(得分:3)
文件入站端点是一个轮询器,因此它使用一个线程。如果您使流程同步,那么您将捎带此单个线程,从而一次处理一个文件。
您需要创建仅允许2个线程的流处理策略。使用以下允许500个线程的示例:http://www.mulesoft.org/documentation/display/current/Flow+Processing+Strategies#FlowProcessingStrategies-Fine-TuningaQueued-AsynchronousProcessingStrategy
编辑:上述提案无法满足此要求:
如果我配置3个线程,那么将从输入目录中选取三个文件,直到这些文件被处理,不应该选择其他文件
实际上,上述提案将始终并行处理3个文件,而不是以3个为一组进行处理。
所以我提出了这种替代方法:
poll
元素作为来源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个文件都已处理完毕。