Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果耗电元件关闭,会发生什么?(MassTransit)_C#_Azure_Azureservicebus_Masstransit - Fatal编程技术网

C# 如果耗电元件关闭,会发生什么?(MassTransit)

C# 如果耗电元件关闭,会发生什么?(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

我使用MassTransit和Azure服务总线作为传输工具编写了consumer

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
。您最好使用重试策略,然后如果仍然失败,则允许异常对使用者造成故障。我说的不是异常,而是当使用者收到消息时停止应用程序。是一样的吗?我将在错误队列中获取消息?