easynetQ延迟响应/请求导致超时

时间:2015-05-08 13:32:51

标签: rabbitmq easynetq

在我们的服务器(Windows Server 2008)上使用EasyNetQ时,我遇到了使用EasyNetQ的请求/响应模式的问题。目前无法在本地重现。

设置是我们有2个Windows服务(作为控制台应用程序运行),它们通过EasyNetQ中的请求/响应模式连接。直到最近,服务器一直在按预期工作,请求方在请求超时之前不会“消耗”响应。

我已经包含2个指向pastebin的链接,其中包含EasyNetQ的控制台日志记录,希望能让我的问题更加清晰。

RequestSide

RespondSide

除此之外,我的请求代码如下所示:

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设置已经过彻底测试,它按预期工作,并不应该与请求/响应问题真正相关,但我想我会提供更多的背景。

1 个答案:

答案 0 :(得分:0)

我有同样的问题,我的问题是我只在响应中设置了超时但在请求方面没有设置超时,在我设置了两侧的时间后它工作正常 我的联系,例如。 主机=主机名;超时= 120;虚拟主机=为myhost;用户名=名为myUsername; PASSW ORD =输入mypassword