2017-03-06 16 views
1

メッセージングに基づいて一部のワーカーロールを開始するアプリケーションで作業しています。C#のMasstransit/RabbitMQで特定のチャネル/ルーティングキーにメッセージを送信

これは私は、アプリケーションが仕事をしたい方法です:

Client sends a request for work (RPC). 

One of the worker roles accepts the work, generates a random id, and responds to the RPC with the new id. 
The worker will post its debug logs on a log channel with the id. 
The client will subscribe to this channel so users can see what's going on. 

RPCが正常に動作しているが、私は、ログの送信を実装する方法を見つけ出すように見えることはできません。

これが作業を受け入れるコードがある(簡体字)

var bus = Bus.Factory.CreateUsingRabbitMq(sbc => 
{ 
    var host = sbc.Host(new Uri("rabbitmq://xxxxxx.nl"), h => 
    { 
     h.Username("xxx"); 
     h.Password("xxxx"); 
    }); 


    sbc.ReceiveEndpoint(host, "post_work_item", e => 
    { 
     e.Consumer<CreateWorkItemCommand>(); 
    }); 

    sbc.ReceiveEndpoint(host, "list_work_items", e => 
    { 
     e.Consumer<ListWorkItemsCommand>(); 
    }); 
}); 

CreateWorkItemCommand、など今、どのように私は、ログ送信Masstransitとを実装して作業を行う、スレッドを作成しますか?私はのようなものを考えていた:

bus.Publish( 
    obj: WorkUpdate{ Message = "Hello world!" }, 
    channel: $"work/{work_id}" 
) 

そして、クライアントは、何かこれを行うだろう:私はこれを行う方法を見つけることができないよう

bus.ReceiveFromEvented($"work/{rpc.work_id}").OnMessage += { more_psuedo_code() } 

を。

誰でもお手伝いできますか?

ありがとうございます!

答えて

1

サガ番のように見えます。です。現在のTurnoutの実装では、ジョブ自体を監視しているので、実際にそのメッセージフローを購読することはできません。そして、まだ実際にはは完了していません

サガを使用して解決できる場合があります。いくつかの外部トリガー(コマンド)は、要求/応答を使用して処理を開始し、処理を行い、相関ID(ジョブID)を取得する、最初のサガを開始します。長い仕事は、同じ相関IDを使用して進捗報告を公表することができ、サガはそれらを消費し、必要な処理を行います。

"work/{rpc.work_id}"は、相関関係に置き換えられます。

関連する問題