2013-11-28 96 views
0

我有簡單的UntypedActor其中有一組用戶。演員可以處理2種類型的消息('SUB' - 向訂閱者添加發件人,'UNSUB' - 從訂閱者刪除發件人)和其他消息重新發送給訂閱者。Akka路由與兩個路由器配置同時

private static class Dispatcher extends UntypedActor { 
    private Set<ActorRef> subscribers; 

    public Dispatcher() { 
     subscribers = Sets.newHashSet(); 
    } 

    @Override 
    public void onReceive(Object o) throws Exception { 
     if ("SUB".equals(o)) { 
      subscribers.add(getSender()); 
      return; 
     } 

     if ("UNSUB".equals(o)) { 
      subscribers.remove(getSender()); 
      return; 
     } 

     for (ActorRef subscriber : subscribers) { 
      subscriber.tell(o, getSender()); 
     } 
    } 
} 

我想用兩種不同的策略創建路由器:廣播,roundrobin。

final int routeeCount = 2; 

    BroadcastRouter broadcastRouter = new BroadcastRouter(routeeCount); 
    RoundRobinRouter roundRobinRouter = new RoundRobinRouter(routeeCount); 

    ActorRef broadCastRef = actorSystem.actorOf(Props.create(Dispatcher.class) 
      .withRouter(broadcastRouter), "Broadcast"); 
    ActorRef roundRobinRef = actorSystem.actorOf(Props.create(Dispatcher.class) 
      .withRouter(roundRobinRouter), "RoundRobin"); 

每個路由器都會創建個人路由器組,但它不適合我。我想使用相同演員路由器,因爲我具有以下用例:

  1. 演員發送消息「SUB」broadCastRef;
  2. broadCastRef廣播消息發送到它自己的2個兒童演員(X1X2)(routeeCount = 2);
  3. 從現在開始,我將使用roundRobinRef將消息傳遞給演員一個

所以問題是如何在兩個不同的路由器角色中重用角色?

回答

1

對於您的用例,您不需要兩個不同的路由器,因爲您只需發送一條包含訂閱請求的akka.routing.Broadcast消息,它將被路由到RoundRobinRouter的所有路由。一般來說,如果你想使用兩個不同的路由器路由到同一組目標,那麼你需要分別創建路由並將它們傳遞給路由器here(向下滾動一點)。