.net core RabbitMQ/MassTransit超时
我们使用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
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)。