0
我正在使用java akka框架。我的一些演員在接受方法上會做同樣的事情。有沒有辦法避免這種情況,並讓他們到一個共同的位置。 (可能使用繼承)Java akka將常用的東西放到一個地方
問題詳細如下。
- 在某些演員中,它根據條件發送ack消息。這個ACK 被另一個演員發送到外部系統。
- 這是重複在幾個類。
我正在使用java akka框架。我的一些演員在接受方法上會做同樣的事情。有沒有辦法避免這種情況,並讓他們到一個共同的位置。 (可能使用繼承)Java akka將常用的東西放到一個地方
問題詳細如下。
因爲一個演員的Receive
塊是一個局部函數,可以鏈Receive
塊與orElse
。這對於在演員之間共享行爲很有幫助,並在documentation的Scala版本中進行了描述,但您可以在Java中執行相同的操作。
以下是一個使用繼承的簡單示例,其中常見的批註行爲是在基類中定義的。不過,你不必使用繼承並不管你想要可以定義Receive
塊:
import akka.actor.AbstractActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;
public class AckingActor extends AbstractActor {
private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
public static class Msg1 {}
public static class Ack {}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Msg1.class, m -> getSender().tell(new Ack(), getSelf()))
.matchAny(m -> log.info("unknown message"))
.build();
}
}
演員共享ACKING行爲可以擴展基類:
import akka.actor.AbstractActor;
public class AckingProducer extends AckingActor {
private AbstractActor.Receive producerBehavior;
public AckingProducer() {
producerBehavior =
receiveBuilder()
.matchEquals("foo", m -> getSender().tell("bar", getSelf()))
.matchEquals("ping", m -> getSender().tell("pong", getSelf()))
.build();
}
@Override
public Receive createReceive() {
return producerBehavior.orElse(super.createReceive());
//^chain the Receive blocks with orElse
// e.g., behavior1.orElse(behavior2).orElse(behavior3)
}
}
你可以鏈的任意數量的Receive
塊。請注意,如果多個部分函數處理相同的消息,則匹配的第一個函數(即匹配的orElse
鏈中的第一個Receive
塊)將處理該消息。
我會避免繼承,並考慮將演員接口放入庫中,然後使用合成將必要的utils/service類包含在演員中。 – christopher