2017-08-31 45 views
0

我正在使用java akka框架。我的一些演員在接受方法上會做同樣的事情。有沒有辦法避免這種情況,並讓他們到一個共同的位置。 (可能使用繼承)Java akka將常用的東西放到一個地方

問題詳細如下。

  • 在某些演員中,它根據條件發送ack消息。這個ACK 被另一個演員發送到外部系統。
  • 這是重複在幾個類。
+1

我會避免繼承,並考慮將演員接口放入庫中,然後使用合成將必要的utils/service類包含在演員中。 – christopher

回答

0

因爲一個演員的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塊)將處理該消息。