在我们的服务器(Windows Server 2008)上使用EasyNetQ时,我遇到了使用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&amp; 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设置已经过彻底测试,它按预期工作,并不应该与请求/响应问题真正相关,但我想我会提供更多的背景。
答案 0 :(得分:0)
我有同样的问题,我的问题是我只在响应中设置了超时但在请求方面没有设置超时,在我设置了两侧的时间后它工作正常 我的联系,例如。 主机=主机名;超时= 120;虚拟主机=为myhost;用户名=名为myUsername; PASSW ORD =输入mypassword