.net core RabbitMQ/MassTransit超时

.net core RabbitMQ/MassTransit超时,.net-core,rabbitmq,masstransit,.net Core,Rabbitmq,Masstransit,我们使用RabbitMQ和MassTransit在发布者和消费者之间交换消息。有时,我们在异常消息下面,然后我们所有的消息传输突然停止。我也在下面发布我们的总线配置代码 One or more errors occurred. (Timeout waiting for response, RequestId: 00c60000-0aff-0242-e641-08d6a323ec24)", "MassTransit.RequestTimeoutException: Timeout wa

我们使用RabbitMQ和MassTransit在发布者和消费者之间交换消息。有时,我们在异常消息下面,然后我们所有的消息传输突然停止。我也在下面发布我们的总线配置代码

    One or more errors occurred. (Timeout waiting for response, 
RequestId: 00c60000-0aff-0242-e641-08d6a323ec24)", 
"MassTransit.RequestTimeoutException: Timeout waiting for response, 
RequestId: 00c60000-0aff-0242-e641-08d6a323ec24   at MassTransit.Clients.ResponseHandlerConnectHandle`1.GetTask()   
at MassTransit.Clients.ClientRequestHandle`1.HandleFault()   at MassTransit.Clients.ResponseHandlerConnectHandle`1.GetTask()   
at MassTransit.Clients.RequestClient`1.GetResponse[T](TRequest message, CancellationToken cancellationToken, RequestTimeout timeout)
这是我们的总线配置

service.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                if (startQuartz) 
                {
                    startQuartz = false;
                    MicroServiceConfig.MicroServiceHost.StartScheduledServices();
                }
                var config = provider.GetRequiredService<SLOTServerConfiguration>();
                var vh = GetVirtualHost(config);
                var url = config.RabbitMQHost + (config.RabbitMQHost.EndsWith("/") ? "" : "/") + vh;
                var host = cfg.Host(new Uri(url), hst =>
               {
                   hst.Username(config.RabbitMQUserName);
                   hst.Password(config.RabbitMQPassword);
               });
                if (!isApi)
                {
                    cfg.AddReceiveEndpoint(host, provider, service, isApi);
                    host.ConnectConsumeObserver(new UserObserver());
                    host.ConnectSendObserver(new ErrorObserver());
                }
            }));
            service.AddSingleton<IPublishEndpoint>(provider => provider.GetRequiredService<IBusControl>());
            service.AddSingleton<ISendEndpointProvider>(provider => provider.GetRequiredService<IBusControl>());
            service.AddSingleton<IBus>(provider => provider.GetRequiredService<IBusControl>());
            service.AddSingleton<IHostedService, BusService>();

            service.AddMassTransit(x =>
            {
                var method = x.GetType().GetMethod("AddConsumer");
                foreach (var item in RegisteredTypes)
                {
                    method.MakeGenericMethod(item.ConsumerType).Invoke(x, new object[0]);
                }
            });
        }

        private static void AddReceiveEndpoint(this IRabbitMqBusFactoryConfigurator cfg, IRabbitMqHost host, IServiceProvider provider, IServiceCollection service, bool registerClient)
        {
            var queueName = DateTime.Now.ToFileTimeUtc().ToString() + JsonConvert.SerializeObject(MicroServiceConfig.MicroServiceHost.ServiceNames).GetHashCode();
            cfg.ReceiveEndpoint(host, queueName, e =>
            {
                e.AutoDelete = true;
                e.PrefetchCount = 16;
                e.UseMessageRetry(x => x.Interval(2, 100));
                e.LoadFrom(provider);
            });
        }

        private static string GetVirtualHost(SLOTServerConfiguration config)
        {

            var vh = config.RabbitMQVirtualHost;
            if(string.IsNullOrEmpty(vh))
            {
                vh = Environment.MachineName;
            }
        }
service.AddSingleton(provider=>Bus.Factory.CreateUsingRabbitMq(cfg=>
{
如果(startQuartz)
{
startQuartz=false;
MicroServiceConfig.MicroServiceHost.StartScheduledServices();
}
var config=provider.GetRequiredService();
var vh=GetVirtualHost(配置);
var url=config.RabbitMQHost+(config.RabbitMQHost.EndsWith(“/”):“/”+vh;
var host=cfg.host(新Uri(url),hst=>
{
Username(config.RabbitMQUserName);
密码(config.RabbitMQPassword);
});
如果(!isApi)
{
AddReceiveEndpoint(主机、提供者、服务、isApi);
ConnectConsumeObserver(新的UserObserver());
ConnectSendObserver(新的ErrorObserver());
}
}));
service.AddSingleton(provider=>provider.GetRequiredService());
service.AddSingleton(provider=>provider.GetRequiredService());
service.AddSingleton(provider=>provider.GetRequiredService());
service.AddSingleton();
service.AddMassTransit(x=>
{
var method=x.GetType().GetMethod(“AddConsumer”);
foreach(RegisteredTypes中的变量项)
{
方法.MakeGenericMethod(item.ConsumerType).Invoke(x,新对象[0]);
}
});
}
私有静态void AddReceiveEndpoint(此IRabbitMqBusFactoryConfigurator cfg、IRabbitMqHost主机、IServiceProvider提供程序、IServiceCollection服务、bool registerClient)
{
var queueName=DateTime.Now.ToFileTimeUtc().ToString()+JsonConvert.SerializeObject(MicroServiceConfig.MicroServiceHost.ServiceNames).GetHashCode();
ReceiveEndpoint(主机,队列名,e=>
{
e、 自动删除=真;
e、 预取计数=16;
e、 UseMessageRetry(x=>x.Interval(2100));
e、 从(供应商)处下载;
});
}
私有静态字符串GetVirtualHost(SLOTServerConfiguration配置)
{
var vh=config.RabbitMQVirtualHost;
if(string.IsNullOrEmpty(vh))
{
vh=环境.MachineName;
}
}
更新: 您可以在下面找到发布者和使用者代码块

var res = ThreadClient.GetResponse<AddExternalOutboundOrderListRequestModel, OutboundOrderResponseItem>(
                       _requestClient,
                       new ServerRequest<AddExternalOutboundOrderListRequestModel> { Model = model, Token = Request.Headers["token"] }
                       );
                var ret = BaseResponseModel.Ok(res.Data, Request.Headers["RequestID"]);
                ret.ExceptionMessage = res.ThreadExceptions;
                return ret;
var res=ThreadClient.GetResponse(
_请求客户端,
新服务器请求{Model=Model,Token=Request.Headers[“Token”]}
);
var ret=BaseResponseModel.Ok(res.Data,Request.Headers[“RequestID”]);
ret.ExceptionMessage=res.ThreadExceptions;
返回ret;
消费者:

public Task Consume(ConsumeContext<ServerRequest<AddExternalOutboundOrderListRequestModel>> context)
        {
            var response = _outboundOrderWorkFlow.Add(context.Message.Model);
            ServerResponse<OutboundOrderResponseItem> res = new ServerResponse<OutboundOrderResponseItem>
            {
                Data = response
            };
            context.Respond(res);
            return Task.Delay(0);
        }
公共任务消费(消费上下文)
{
var response=\u outboundOrderWorkFlow.Add(context.Message.Model);
ServerResponse res=新的ServerResponse
{
数据=响应
};
语境。回应(res);
返回任务。延迟(0);
}

错误来自请求-响应客户端,但您没有显示如何使用它的代码。谢谢,我更新了代码。我强烈建议您阅读容器文档并使用该设置,因为您的配置代码过于复杂:--另外,您可以使用AddConsumer(Type consumerType)。