2016-07-15 14 views
2

私は単純なマストトランジットリクエスト/レスポンスの概念証明を持っています。それは2つのアプリケーションで構成されています.1つはメッセージ送信用で、もう1つはメッセージ消費用です。 アプリを送信メッセージは、次のように進む:MassTransit ESBのCancellationTokenによるリクエスト/レスポンス通信をキャンセルするにはどうすればよいですか?

var basicClient=_busControl.CreateRequestClient<IRequest,IResponse>(queueUri, timeout); 
return await basicClient.Request(new Request(json), token); 

Request方法は、第二のオプションのパラメータとしてCancellationTokenをとります。我々はConsumeContextCancellationTokenフィールドを持って見ることができるように

public async Task Consume(ConsumeContext<IRequest> context) 
{ 
     var outputJson = await _longRunningJob.Execute(context.Message.Input, context.CancellationToken); 
     context.Respond(new Response(outputJson)); 
} 

メッセージコンシューマは、次のコードを持っています。

質問は次のとおりです。これらのトークンはどのように使用できますか?

私のメッセージ送信アプリでは、 の返信をお待ちしておりますが、メッセージコンシューマでは_longrunningJobの完了を待ってキャンセルしたいと思います。

  1. 私はRequestメソッドにトークンを渡ししようと、私は方法がOperationCancelledExceptionを投げることを期待するが、私はちょうど応答を取得私のCancellationTokenSourceCancel()を呼びます!
  2. 私はすでに取り消されたトークンをこのメソッドに渡そうとしましたが、何も起こりませんでした。
  3. その後、私はMasstransitのソースコードを見て、token.ThrowIfCancellationIsRequested()がどこでも呼び出されていないことを知りました!

私はここで何か間違っていると言いますが、CancellationTokensに対処する別の方法があるのですか、まさにMasstransitのバグですか?

+0

"token.ThrowIfCancellationIsRequested()"をスローする必要があります。それ以外の場合、非同期タスクはキャンセルされているかどうかはわかりません。 –

+0

リクエスタでは、タイムアウトを指定できます。キャンセルトークンを使用するよりも優れていると思います。消費者についてはわかりませんが、長期間の作業でMassTransitとはまったく非同期/待機しています。消費者の取り消しトークンがリクエスタに対して要求を持っているかどうかはわかりません。要求者に何かが起こったことを知らせる適切な方法は、技術を使うのではなく、適切な応答メッセージを送ることです。 –

+0

@x ...私はそのメソッドを呼び出す必要はありませんが、MassTransitはそうすべきです。 –

答えて

0

リクエストに渡されるCancellationTokenは、リクエスト自体をキャンセルすることです。リクエストはコンシューマに渡されません。

私たちは、次のアプローチを使用して消費者をキャンセルするために管理:

  1. が古い場合は、その後UtcNowにExpiryDateヘッダを比較して、消費者に要求(UtcNow +タイムアウト)
  2. に満了日のヘッダを追加します。メソッドを終了する
関連する問題