适用于Akka的Java聚合器

时间:2015-06-19 09:34:24

标签: java akka aggregation integration-patterns

我正在尝试为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秒。在超时时,它应该抛出某种异常。在聚合时,应重置计时器。任何想法如何做到这一点?

1 个答案:

答案 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以获取更多示例。