2016-09-13 8 views
1

私は子供の "コンシューマー"アクターをいくつかの外部データストリームに接続し、メッセージを解析してアプリケーション内でさらに転送します。この「プロデューサ」システムにはpub-subアーキテクチャがありますが、再接続後にサブスクリプションを復元することはありません。現在、これらのサブスクリプションを親アクターに保存してスーパーバイザに再送信しますが、問題は子プロセスが再起動している間にデッドレターキューに転送されることです。私はいくつかの遅延の後にこれらを親にスケジューリングすることができましたが、これはサブスクリプションの順序を妨げる可能性がありますが、これは重要です。Akkaアクターの再起動時に "init"メッセージを再送信

したがって、これらの「再登録」メッセージを再起動中に子供に配信するにはどうすればよいですか?

+0

子どもはBackoffSupervisorによって 'Backoff.onFailure(...)withSupervisorStrategy(resubscribingStrategy)' – fghkngfdx

答えて

1

再起動フック(http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Restart_Hooks):preRestart APIとpostRestart APIを使用できます。

子供の俳優のpreRestartについて、あなたは子供の俳優が再開されることを管理者に知らせる必要があり、監督はメッセージの送信を中断する必要があります。

子供の俳優のpostRestartで、あなたは子供が利用可能であることを監督者に知らせる必要があり、監督者はメッセージの送信を再開する必要があります。

+0

"私は再始動しています"を送信する子と親に子を送信する間に競争はありませんか? – tariksbl

+0

はい、それは正しいプロトコルを実装する問題ですが、子がまだ前のメッセージがすでに処理中であることを確認していない場合、親は子にメッセージを送信すべきではありません。 –

0

あなたが

context.system.eventStream.subscribe(myListenerActorRef, classOf[DeadLetter]) 
... 
def receive = { 
    case DeadLetter(msg, from, to) => 
    //Do my custom stuff here 
} 

、店舗で死んだ手紙に加入し、それらを再度送信することができます。

+0

によって監督されますが、これにより2つのメッセージ「キュー」が作られ、その順序が危険にさらされる可能性があります。死んでいる化身にそれを送り、その拒絶を再処理しようとせずに、俳優のスタートでメッセージをスケジュールする方法はありますか? – fghkngfdx

+0

可能性のあるハック - アクターを再起動する際に 'listensDeadletters/listensRegular'状態を導入します。しかし、よりよい解決策はアクターのプールを持つことです。そのため、1つを再起動することは有害ではありません。 – dveim

関連する問題