2016-06-29 8 views
1

サービスファブリックのアクターモデルは、私が知る限り、「要求 - 応答」スタイルの通信だけをサポートしています。私は "火と忘れない"スタイルのコミュニケーションを達成する方法はありますか?俳優とのメッセージを忘れる

私はこのブログ記事(http://mikhail.io/2016/01/fire-and-forget-in-service-fabric-actors/)に出会ったが、これが悪影響を及ぼすかどうか、または推奨される方法があるかどうかは確信していない。これを達成するの?

答えて

1

あなたのタスクに必要なものをシードするアクターにinitializeメソッドがあります。タイマーを設定し、initializeメソッドから戻ります。タイマーが起動すると、タイマーをシャットダウンし、ロジックを実行します。下の粗いサンプル。

public class SomeActor : Actor, ISomeActor 
{ 
    private IActorTimer _sendTimer; 

    protected override async Task OnActivateAsync() 
    { 
     await base.OnActivateAsync(); 
    } 

    protected override async Task OnDeactivateAsync() 
    { 
     await this.ExecuteAgents(); 
     await base.OnDeactivateAsync(); 
    } 

    public Task Initialize() 
    { 
     if (_sendTimer == null) 
     { 
      //setup timer 
      _sendTimer = this.RegisterTimer((obj) => 
      { 
       return this.Execute(); 
      }, 
       null, 
       TimeSpan.FromSeconds(1), 
       TimeSpan.FromSeconds(30)); 
     } 
    } 

    private async Task ExecuteAgents() 
    { 
     this.UnegisterTimer(_sendTimer); 

     //Perform workload 
    } 
} 
+0

初期化ではパラメータとして文字列が使用され、複数のアクタがこのアクタを呼び出すとします。その後、同じアクタに複数のコールを受信すると、各コールに対して複数のタイマーを追跡する必要がありますか? (私がこれを正しく理解している場合) –

+0

それはあなたがしたい行動に依存します。 1つの方法は、無作為に生成されたIDを使用して、毎回新しいアクターインスタンスを取得することです(_sendTimerがヌルかどうかを確認して衝突をチェックする)。衝突を処理する代わりに、キューベースの実装を設定することもできます。衝突が発生した場合、特定のアクターインスタンスは、時間がたつと2つの作業を行うだけです。 –

+0

SF図書のこの図は、多くを説明しています。 diff actorサービスのためにクライアントをスワップするだけです。 http://i.stack.imgur.com/PeuKY.png –

関連する問題