サーバー (Windows Server 2008) で EasyNetQ の要求/応答パターンを使用しているときに問題が発生しました。現時点では、ローカルで再現することはできません。
セットアップでは、EasyNetQ の要求/応答パターンを介して接続された 2 つの Windows サービス (テスト用のコンソール アプリケーションとして実行) があります。これは、要求がタイムアウトするまで要求側が応答を「消費」しないサーバーで、最近まで期待どおりに機能していました。
EasyNetQ のコンソール ログを含むペーストビンへの 2 つのリンクを含めました。これにより、問題がもう少し明確になることを願っています。
それに加えて、私のリクエストコードは次のようになります。
var request = new foobar();
var response = _bus.Request<foobar, foobar2>(request);
そして応答側で:
var response = new response();
_bus.Respond<foobar, foobar2>(request =>
{
try
{
....
return response;
}
catch (Exception e)
{
....
return response;
}
});
私が言ったように、要求側は期待どおりに要求を送信し、応答側はそれを消費/キャッチします。これは正常に機能しますが、応答側が処理を完了して応答すると (メッセージは RabbitMQ 管理で確認できます)、要求がタイムアウトになるまで、要求は応答を消費/キャッチしません (デフォルトのタイムアウトは 10 秒です。同様に 60 秒に設定してみましたが、違いはありません)。これは、RequestSide に表示されるように、上記のリンクのログでも明らかであり、以前にタイムアウトした応答キューから 5 つほどのメッセージが受信されています。
処理に時間がかかりすぎて何かが台無しになった場合に備えて、RespondAsync を使用してみましたが、役に立ちませんでした。RespondAsync と RequestAsync の両方を使用してみましたが、すべてがさらに台無しになりました (おそらく、リクエストで何か間違ったことをしていたのでしょう :))。
何かが欠けているかもしれませんが、ここから何を試したらよいかわかりません。
編集:何かを台無しにしたことに気づきました。以下のコンテキストを追加するだけでなく、
要求/応答に使用される IBus が作成され、Ninject で注入されます。
class FooModule : NinjectModule
{
public override void Load()
{
Bind<IBus>().ToMethod(ctx => RabbitHutch.CreateBus("host=localhost", x => x.Register<IEasyNetQLogger>(_ => logger))).InSingletonScope();
}
}
そして、それはすべて、Topshelf と Ninject を使用して構築されているサービスによって次のように結び付けられています。
static void Main(string[] args)
{
HostFactory.Run(x =>
{
x.UseNinject(new FooModule());
x.Service<FooService>(s =>
{
s.ConstructUsingNinject();
s.WhenStarted((service, control) => service.Start(control));
s.WhenStopped((service, control) => service.Stop(control));
});
x.RunAsLocalSystem();
});
}
Topshelf のセットアップはすべてかなり徹底的にテストされており、意図したとおりに機能し、要求/応答の問題には実際には関係ありませんが、もう少しコンテキストを提供すると思いました.