Java 如何检查所有演员完成后
我是阿克卡工具包的新手。我需要在多个文件上运行一个进程,这需要相当长的时间。因此,我为每个文件创建了一个参与者并开始处理。我在POJO类中创建这些演员,如下所示:Java 如何检查所有演员完成后,java,akka,actor,Java,Akka,Actor,我是阿克卡工具包的新手。我需要在多个文件上运行一个进程,这需要相当长的时间。因此,我为每个文件创建了一个参与者并开始处理。我在POJO类中创建这些演员,如下所示: public class ProcessFiles { private static final Logger logger = LoggerFactory.getLogger(ProcessFiles.class.getSimpleName()); public static void main(String[]
public class ProcessFiles {
private static final Logger logger = LoggerFactory.getLogger(ProcessFiles.class.getSimpleName());
public static void main(String[] args) throws IOException, InterruptedException {
long startTime = System.currentTimeMillis();
logger.info("Creating actor system");
ActorSystem system = ActorSystem.create("actor_system");
Set<String> files = new HashSet<>();
Stream<String> stringStream = Files.lines(Paths.get(fileName));
stringStream.forEach(line -> files.addAll(Arrays.asList(line.split(","))));
List<CompletableFuture<Object>> futureList = new ArrayList<>();
files.forEach((String file) -> {
ActorRef actorRef = system.actorOf(Props.create(ProcessFile.class, file));
futureList.add(PatternsCS.ask(actorRef, file, DEFAULT_TIMEOUT).toCompletableFuture());
});
boolean isDone;
do {
Thread.sleep(30000);
isDone = true;
int count = 0;
for (CompletableFuture<Object> future : futureList) {
isDone = isDone & (future.isDone() || future.isCompletedExceptionally() || future.isCancelled());
if (future.isDone() || future.isCompletedExceptionally() || future.isCancelled()) {
++count;
}
}
logger.info("Process is completed for " + count + " files out of " + files.size() + " files.");
} while (!isDone);
logger.info("Process is done in " + (System.currentTimeMillis() - startTime) + " ms");
system.terminate();
}
}
这里,ProcessFile是actor类。在调用所有参与者以退出程序后,主进程每隔30秒检查所有参与者是否完成。有没有更好的方法来实现这种功能?我建议再创建一个actor来跟踪系统中所有actor的终止,并在所有actor都被杀死时关闭actor系统。 所以在你的申请中- 处理文件后,ProcessFile actor可以向self发送毒药丸。 WatcherActor将watchcontext.watchprocessFileActor指定ProcessFileActor并维护已注册的所有ProcessFile Actor的计数 在actors终止时,WatcherActor将接收终止的消息。
它将减少计数,当计数达到0时,关闭ActorSystem。PatternsCS.askactorRef,DEFAULT\u TIMEOUT中是否有输入错误?Akka 2.5中没有只使用两个参数的变体。@chunjef我纠正了错误。但是如果创建actor系统的主函数中的执行流在actor完成之前完成,进程本身不会结束吗?Java进程直到所有线程完成后才结束。