Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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# 4.0 C#处理n次执行重试的最佳方法使用polly将消息发送到队列_C# 4.0_Async Await_Rabbitmq_Masstransit_Polly - Fatal编程技术网

C# 4.0 C#处理n次执行重试的最佳方法使用polly将消息发送到队列

C# 4.0 C#处理n次执行重试的最佳方法使用polly将消息发送到队列,c#-4.0,async-await,rabbitmq,masstransit,polly,C# 4.0,Async Await,Rabbitmq,Masstransit,Polly,我正在使用MassTransit和RabbitMQ将消息发布到队列。 有谁能告诉我,如果没有可用的队列并使用Polly尝试n次,处理异常的最佳方法是什么 以下是我将消息发布到队列的代码: private async Task PublishToQueue(ChangeDetected changeDetected) { _logProvider.Info("Publish to Queue started"); try { await _busContro

我正在使用MassTransit和RabbitMQ将消息发布到队列。 有谁能告诉我,如果没有可用的队列并使用Polly尝试n次,处理异常的最佳方法是什么

以下是我将消息发布到队列的代码:

private async Task PublishToQueue(ChangeDetected changeDetected)
{
    _logProvider.Info("Publish to Queue started");

    try
    {
       await _busControl.Publish(changeDetected);

        _logProvider.Info($"ChangeDetected message published to RabbitMq. Message");
    }
    catch (Exception ex)
    {
        _logProvider.Error("Error publishing message to queue: ", ex);

        throw;
    }
}
我可以在quartz.net作业中使用以下代码来实现polly retry吗

                //Publish message to queue
                Policy
                    .Handle<Exception>()
                    .RetryAsync(_configReader.RetryLimit, (exception, count) =>
                    {
                        //Do something for each retry
                    })
                    .ExecuteAsync(async () =>
                    {
                        await PublishToQueue(message);
                    });
//将消息发布到队列
政策
.Handle()
.RetryAsync(_configReader.RetryLimit,(异常,计数)=>
{
//每次重试都要做些什么
})
.ExecuteAsync(异步()=>
{
等待发布队列(消息);
});

谢谢

好吧,这行得通吗?这项政策在其他情况下也行得通。但不确定在将消息发布到队列时如何进行测试。因为传递给publish方法的任何对象似乎都可以工作,而publish方法似乎不会引发任何异常。感谢您的帮助。Hi@mukildephthi该模式当然是可能的(我们正是通过Polly、EasyNetQ、RabbitMQ和我们构建的一些自定义消息传递弹性来实现这种模式的)。不过,如果MassTransit没有通过抛出异常指示任何错误,Polly将无法执行任何操作。关于
发布
如何表示失败,他们的文档说明了什么?我假设publish也没有返回一个值得检查的
任务
——如果是,您需要以正常的方式观察任务异常(和/或在Polly中使用
ExecuteAsync
变体)。Hi@Mountaintraveler,是的,publish方法返回任务。请用正确的实现更新示例代码好吗?Hi@Mukildephthi我没有Quartz/MassTransit在本地检查特定的实现,但原则上它看起来很好:您建议使用
RetryAsync
/
ExecuteAsync
应该让Polly处理
PublishToQueue(…)中引发的任何异常
。当您尝试该实现时会发生什么?github上的repo包含使用相同模式的异步示例。那么,它是否有效?此策略在其他一些场景中有效。但不确定在将消息发布到队列时如何进行测试。因为传递给publish方法的任何对象似乎都可以工作,而publish方法似乎不会引发任何异常。感谢您的帮助。Hi@mukildephthi该模式当然是可能的(我们正是通过Polly、EasyNetQ、RabbitMQ和我们构建的一些自定义消息传递弹性来实现这种模式的)。不过,如果MassTransit没有通过抛出异常指示任何错误,Polly将无法执行任何操作。关于
发布
如何表示失败,他们的文档说明了什么?我假设publish也没有返回一个值得检查的
任务
——如果是,您需要以正常的方式观察任务异常(和/或在Polly中使用
ExecuteAsync
变体)。Hi@Mountaintraveler,是的,publish方法返回任务。请用正确的实现更新示例代码好吗?Hi@Mukildephthi我没有Quartz/MassTransit在本地检查特定的实现,但原则上它看起来很好:您建议使用
RetryAsync
/
ExecuteAsync
应该让Polly处理
PublishToQueue(…)中引发的任何异常
。当您尝试该实现时会发生什么?github上的repo包含使用相同模式的异步示例。