3

時間をかけてブロードキャスト アクターにルートを動的に追加/削除させる正しい方法は何ですか?

問題のコンテキスト: アクターは特定のアイテムの価格変更をリッスンし、他のすべてのアクター (ルート) に価格変更をブロードキャストし、内部ルールに従って行動します (たとえば、価格が X 購入または販売の場合)。

私は Akka を初めて使用しますが、ドキュメントを読んだ後、必要なコンポーネントを理解したと思いますが、私の設計または使用されているコンポーネントが間違っていると思われる場合は、コメント/回答してください。

決まったルートリストから変更したい

        ActorRef actor1 = system.actorOf(new Props(LimitOrderActor.class));
        ActorRef actor2 = system.actorOf(new Props(LimitOrderActor.class));
        ActorRef actor3 = system.actorOf(new Props(LimitOrderActor.class));
        Iterable<ActorRef> routees = Arrays.asList(new ActorRef[] { actor1, actor2, actor3 });
        ActorRef actorBroadcastRouter1 = system.actorOf(new Props(TickerWatcherActor.class).withRouter(BroadcastRouter.create(routees)), "router1");

BroadcastRouter が起動して実行された後にアクターが作成される、動的にサイズ設定された BroadcastRouter のようなものに

        int lowerBound = 1;
        int upperBound = 10000;
        DefaultResizer resizer = new DefaultResizer(lowerBound, upperBound);
        BroadcastRouter broadcastRouter2 = new BroadcastRouter(resizer);
        ActorRef actorBroadcastRouter2 = system.actorOf(new Props(TickerWatcherActor.class).withRouter(broadcastRouter2), "router2");

        ActorRef actor4 = system.actorOf(new Props(LimitOrderActor.class).withRouter((RouterConfig) broadcastRouter2));
        ActorRef actor5 = system.actorOf(new Props(LimitOrderActor.class).withRouter((RouterConfig) broadcastRouter2));
        ActorRef actor6 = system.actorOf(new Props(LimitOrderActor.class).withRouter((RouterConfig) broadcastRouter2));

現在、アクター「actorBroadcastRouter2」は、意図した LimitOrderActor アクター 4、5、および 6 ではなくメッセージを受信して​​います。何が間違っていますか?

編集:私が探しているのは、BroadcastRouterではなくイベントバスだと思います

   final ActorRef actor = system.actorOf(new Props(LimitOrderActor.class));
   system.eventStream().subscribe(actor, String.class);
4

2 に答える 2

0

この質問を閉じましょう。私は同じ問題に遭遇していました。これは、ブロードキャスト ルーターが機能する方法ではありません。で既存のブロードキャスト ルータに追加するのではなくactor4actor5で新しいブロードキャスト ルータを作成します。actor6actorBroadcastRouter2

Java で Akka をプログラミングする場合、悲しいことに利用できない Listeners トレイトを使用して、scala で本当に単純なものを求めています。

class MyActor extends Actor with Listeners {
  def receive = {
     case yourmessages => gossip("To All my listeners")
  } orElse listenerManagement
}

val myActor = context.actorOf(Props[MyActor])

myActor ! Listen(someActorRef)

myActor ! "pigdog"

独自の Java バージョンを作成するかDistributedPubSubExtension、より本格的なものに使用する必要があります。

https://groups.google.com/forum/?fromgroups=#!topic/akka-user/NEOY9IxRW5I

https://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/routing/Listeners.scala

http://doc.akka.io/docs/akka/snapshot/contrib/distributed-pub-sub.html#a-small-example-in-java

于 2013-04-25T10:19:43.097 に答える
0

BroadcastRouter ではなく Event Bus を使用します。

final ActorRef actor = system.actorOf(new Props(LimitOrderActor.class));
system.eventStream().subscribe(actor, String.class);
于 2015-08-21T16:51:44.527 に答える