我正在尝试为Akka实现Java Aggregator,Java API支持它们since it doesn't look like(为什么不呢?)
到目前为止,这是我最好的尝试:
// Groovy pseudo-code
abstract class Aggregator<T> extends UntypedActor {
ActorRef recipient
Set<T> aggregation
// TODO: Timer timer (?)
abstract boolean isAggregated()
@Override
void onReceive(Object message) {
aggregation << message as T
if(isAggregated()) {
recipient.tell(new Aggregation(aggregation)) // again, pseudo-code
aggregation.clear()
// TODO: timer.reset()
}
}
}
缺少的是某种Timer
构造,如果尚未聚合,则会在Aggregator
之后计时60秒。在超时时,它应该抛出某种异常。在聚合时,应重置计时器。任何想法如何做到这一点?
答案 0 :(得分:1)
您要找的是ReceiveTimeout
。当特定演员在预定义的时间内没有收到任何东西时,Akka提供了一个超时功能。
在Java中你可以在你的演员中做这样的事情:
getContext().setReceiveTimeout(Duration.create("1 second"));
当触发时,它会向actor发送类型为ReceiveTimeout
的消息,然后您可以决定要执行的操作(例外,记录,重置......)。
您可以在&#39;接收超时&#39;:http://doc.akka.io/docs/akka/snapshot/java/untyped-actors.html
部分下找到更多信息。另一方面,有一些开源库可以在github中提供这些东西。请查看https://github.com/sksamuel/akka-patterns以获取更多示例。