C# 如果耗电元件关闭,会发生什么?(MassTransit)
我使用MassTransit和Azure服务总线作为传输工具编写了consumerC# 如果耗电元件关闭,会发生什么?(MassTransit),c#,azure,azureservicebus,masstransit,C#,Azure,Azureservicebus,Masstransit,我使用MassTransit和Azure服务总线作为传输工具编写了consumer public async Task Consume(ConsumeContext<ISimpleRequest> context) { try { _log.InfoFormat("Strated working on {0}", context.Message.CustomerId); Thread.Sleep(500); _log.I
public async Task Consume(ConsumeContext<ISimpleRequest> context)
{
try
{
_log.InfoFormat("Strated working on {0}", context.Message.CustomerId);
Thread.Sleep(500);
_log.InfoFormat("Returning name for {0}", context.Message.CustomerId);
}
catch(Exception ex)
{
await context.Redeliver(TimeSpan.FromSeconds(1));
}
}
公共异步任务使用(consumercontext)
{
尝试
{
_log.InfoFormat(“处理{0}的策略”,context.Message.CustomerId);
睡眠(500);
_InfoFormat(“返回{0}的名称”,context.Message.CustomerId);
}
捕获(例外情况除外)
{
wait context.Redeliver(TimeSpan.FromSeconds(1));
}
}
如果发生异常,我会将消息重新传递给另一个消费者。但若总线发送了一条消息,消费者开始处理它,进程被关闭,那个么会发生什么呢?我怎样才能不丢失信息?回答: 只有在消费者完成其工作后,才会向传输确认(确认)消息。因此,对于任何未完成的使用者,无论是应用程序停止还是使用者中的异常,消息都将保留在队列中。这与正确终止不同,因为一旦在终止应用程序之前要求busHandle运行Stop(),它将等待当前正在处理的所有消息通过管道运行,然后再允许停止总线。回答:
只有在消费者完成其工作后,才会向传输确认(确认)消息。因此,对于任何未完成的使用者,无论是应用程序停止还是使用者中的异常,消息都将保留在队列中。这与正确终止不同,因为一旦要求busHandle在终止应用程序之前运行Stop(),它将等待当前正在处理的所有消息,在允许停止总线之前通过管道运行。您的意思是消费故障部分?失败的消息放在错误队列上-“使用默认总线配置,捕获异常…并将消息移动到错误队列(以接收端点队列名称为前缀)。异常详细信息与消息一起存储为标题,以便进行分析并帮助排除异常”。您也可以使用故障消息来获取故障通知,而不是通过检查错误队列。但是,对于您当前的代码,我不确定这是否会发生,因为您在异常处理中调用了
Redeliver
。您最好使用重试策略,然后如果仍然失败,则允许异常对使用者造成故障。我说的不是异常,而是当使用者收到消息时停止应用程序。是一样的吗?我将在错误队列中获取消息?您的意思是消费故障部分?失败的消息被放在错误队列上-“使用默认总线配置,捕获异常…并将消息移动到_错误队列(以接收端点队列名称为前缀)。异常详细信息与消息一起存储为标题,以便进行分析并帮助排除异常”。您也可以使用故障消息来获取故障通知,而不是通过检查错误队列。但是,对于您当前的代码,我不确定这是否会发生,因为您在异常处理中调用了Redeliver
。您最好使用重试策略,然后如果仍然失败,则允许异常对使用者造成故障。我说的不是异常,而是当使用者收到消息时停止应用程序。是一样的吗?我将在错误队列中获取消息?