我在我们的服务器(Windows Server 2008)上使用 EasyNetQ 的请求/响应模式时遇到了问题。目前无法在本地复制它。
设置是我们有 2 个 Windows 服务(作为控制台应用程序运行以进行测试),它们通过 EasyNetQ 中的请求/响应模式连接。直到最近,这一直在服务器上按预期工作,其中请求方在请求超时之前不会“消耗”响应。
我已经包含了 2 个指向 pastebin 的链接,其中包含 EasyNetQ 的控制台日志记录,希望能让我的问题更加清晰。
除此之外,我的请求代码如下所示:
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 设置都经过了相当彻底的测试,它按预期工作,并且不应该与请求/响应问题真正相关,但我想我会提供更多的上下文。