私は単純なマストトランジットリクエスト/レスポンスの概念証明を持っています。それは2つのアプリケーションで構成されています.1つはメッセージ送信用で、もう1つはメッセージ消費用です。 アプリを送信メッセージは、次のように進む:MassTransit ESBのCancellationTokenによるリクエスト/レスポンス通信をキャンセルするにはどうすればよいですか?
var basicClient=_busControl.CreateRequestClient<IRequest,IResponse>(queueUri, timeout);
return await basicClient.Request(new Request(json), token);
Request
方法は、第二のオプションのパラメータとしてCancellationToken
をとります。我々はConsumeContext
もCancellationToken
フィールドを持って見ることができるように
public async Task Consume(ConsumeContext<IRequest> context)
{
var outputJson = await _longRunningJob.Execute(context.Message.Input, context.CancellationToken);
context.Respond(new Response(outputJson));
}
:
メッセージコンシューマは、次のコードを持っています。
質問は次のとおりです。これらのトークンはどのように使用できますか?
私のメッセージ送信アプリでは、 の返信をお待ちしておりますが、メッセージコンシューマでは_longrunningJob
の完了を待ってキャンセルしたいと思います。
- 私は
Request
メソッドにトークンを渡ししようと、私は方法がOperationCancelledException
を投げることを期待するが、私はちょうど応答を取得私のCancellationTokenSource
にCancel()
を呼びます! - 私はすでに取り消されたトークンをこのメソッドに渡そうとしましたが、何も起こりませんでした。
- その後、私はMasstransitのソースコードを見て、token.ThrowIfCancellationIsRequested()がどこでも呼び出されていないことを知りました!
私はここで何か間違っていると言いますが、CancellationTokensに対処する別の方法があるのですか、まさにMasstransitのバグですか?
"token.ThrowIfCancellationIsRequested()"をスローする必要があります。それ以外の場合、非同期タスクはキャンセルされているかどうかはわかりません。 –
リクエスタでは、タイムアウトを指定できます。キャンセルトークンを使用するよりも優れていると思います。消費者についてはわかりませんが、長期間の作業でMassTransitとはまったく非同期/待機しています。消費者の取り消しトークンがリクエスタに対して要求を持っているかどうかはわかりません。要求者に何かが起こったことを知らせる適切な方法は、技術を使うのではなく、適切な応答メッセージを送ることです。 –
@x ...私はそのメソッドを呼び出す必要はありませんが、MassTransitはそうすべきです。 –