私はakkaアクターシステムには新しく、アクター内の共通ロジックを実行するためのベストプラクティスは何か迷っていました。akkaシステム - アクター間で共通ロジックを実行するベストプラクティス
class MyActor @Inject()(eventBus: EventBus) extends Actor{
eventBus.subscribe(context.self, Topics.TimeoffPolicy)
override def receive: Receive = {
case Foo(name:String) => {
foo(name)
bar(name)
}
case Bar(name:String) => {
bar(name)
}
case a: Any => log.warning(f"unknown message actor ${a.toString}")
}
}
:
class MyActor @Inject()(eventBus: EventBus) extends Actor{
eventBus.subscribe(context.self, Topics.TimeoffPolicy)
override def receive: Receive = {
case Foo(name:String) => {
//Need to execute foo related logic, and then Bar related logic
}
case Bar(name:String) => {
//Need to execute bar related logic
}
case a: Any => log.warning(f"unknown message actor ${a.toString}")
}
}
だから、1つのオプションの方法に共通ロジックを抽出し、このようにはFooを扱うときにそれを呼び出すことです:私は、次の俳優を持って
: だからここは一例です
その他のオプションは、自分宛にメッセージを送信することです。
class MyActor @Inject()(eventBus: EventBus) extends Actor{
eventBus.subscribe(context.self, Topics.TimeoffPolicy)
override def receive: Receive = {
case Foo(name:String) => {
foo()
self ! Bar(name)
}
case Bar(name:String) => {
bar(name)
}
case a: Any => log.warning(f"unknown message actor ${a.toString}")
}
}
ここでは、メッセージを送信し、すべてのメッセージ処理でカプセル化されたロジックを保つことは理にかなっていますが、メソッドに共通のロジックを抽出して呼び出すのはエラープルーニングが少ないと思います。何がお勧めですか?
アクター間で共通のロジックがある場合、イベントバスを介して他のアクターにメッセージを送信して起動するので、actor1はfooを実行し、もう1つはbarを実行します。 第2のオプションは、同じロジックを別のクラスに抽出し、そのクラスを両方のアクターに注入することです。つまり、fooとbarを実行するには、アクター間の通信がありません。
あなたはどう思いますか?
:
そして、ここでは、私は、非同期1のために書くだろう何ですか? – Tomer
メッセージを 'self'に送る必要はありません。メッセージの元の' sender'への参照を自由に保存し、直接それに返信することができます。とにかく、 'Actor's'' receive'呼び出しは常に' ActorSystem'によってスケジューリングされ、明示的な同期がない場合の正当性は**あなたのすべてのアクターが同期的に処理するメッセージを受け取ったときに**保証されます。競合状態、古いデータ、デッドロックなどの並行性のすべての不具合につながる、他のスレッドで実行されるので、メッセージを送信すること以外のロジックは 'Future'コールバックにはありません。 – Sergey
Amm、非同期ドライバを使ったデータベースへのエントリ?私は次のようなものを持っています:def receive = {case X(name)=> da.save(name)}、保存戻り値はFuture [String]ですか? – Tomer