我相信我有一个解决方案给你,它不涉及积累一大堆Future
s。一是高层概念。将有两个参与者参与此流程。我们将首先调用FilesProcessor
. 这个演员将是短暂的和有状态的。每当您想按顺序处理一堆文件时,您都可以启动该 actor 的一个实例并向其传递一条包含您要处理的文件的名称(或路径)的消息。当它完成所有文件的处理后,它会自行停止。我们将调用的第二个演员LineProcessor
。这个actor是无状态的、长期存在的并且集中在路由器后面。它处理一个文件行,然后响应请求行处理的任何人,告诉他们它已经完成了该行的处理。现在进入代码。
首先是消息:
public class Messages {
public static class ProcessFiles{
public final List<String> fileNames;
public ProcessFiles(List<String> fileNames){
this.fileNames = fileNames;
}
}
public static class ProcessLine{
public final String line;
public ProcessLine(String line){
this.line = line;
}
}
public static class LineProcessed{}
public static LineProcessed LINE_PROCESSED = new LineProcessed();
}
和FilesProcessor
:
public class FilesProcessor extends UntypedActor{
private List<String> files;
private int awaitingCount;
private ActorRef router;
@Override
public void onReceive(Object msg) throws Exception {
if (msg instanceof ProcessFiles){
ProcessFiles pf = (ProcessFiles)msg;
router = ... //lookup router;
files = pf.fileNames;
processNextFile();
}
else if (msg instanceof LineProcessed){
awaitingCount--;
if (awaitingCount <= 0){
processNextFile();
}
}
}
private void processNextFile(){
if (files.isEmpty()) getContext().stop(getSelf());
else{
String file = files.remove(0);
BufferedReader in = openFile(file);
String input = null;
awaitingCount = 0;
try{
while((input = in.readLine()) != null){
router.tell(new Messages.ProcessLine(input), getSelf());
awaitingCount++;
}
}
catch(IOException e){
e.printStackTrace();
getContext().stop(getSelf());
}
}
}
private BufferedReader openFile(String name){
//do whetever to load file
...
}
}
和LineProcessor
:
public class LineProcessor extends UntypedActor{
@Override
public void onReceive(Object msg) throws Exception {
if (msg instanceof ProcessLine){
ProcessLine pl = (ProcessLine)msg;
//Do whatever line processing...
getSender().tell(Messages.LINE_PROCESSED, getSelf());
}
}
}
现在线路处理器正在发回没有附加内容的响应。如果您需要根据线路的处理发回一些东西,您当然可以更改此设置。我确信这段代码不是防弹的,我只是想向你展示一个高级概念,告诉你如何在没有请求/响应语义和Future
s 的情况下完成这个流程。
如果您对此方法有任何疑问或想了解更多详细信息,请告诉我,我很乐意提供。