【发布时间】:2011-10-06 14:11:37
【问题描述】:
我正在寻找方法在连接成功之前远程调用不受我控制的服务。我也不想简单地设置一个计时器,每 n 秒/分钟执行一次操作,直到成功。经过大量研究,断路器模式似乎非常适合。
我找到了一个implementation,它使用了 Castle Windsor 拦截器,看起来很棒。唯一的问题是我不知道如何使用它。从我发现的有关该主题的几篇文章中,我能找到的唯一用法示例是简单地使用断路器来调用一个动作 once,这似乎不是很有用。由此看来,我似乎需要在while(true) 循环中使用断路器来简单地运行我的操作。
我如何使用 Windsor 拦截器来执行调用外部服务的操作,直到它成功而不会撞击我们的服务器?
有人可以补上缺失的部分吗?
这是我能想到的
while(true)
{
try
{
service.Subscribe();
break;
}
catch (Exception e)
{
Console.WriteLine("Gotcha!");
Thread.Sleep(TimeSpan.FromSeconds(10));
}
}
Console.WriteLine("Success!");
public interface IService
{
void Subscribe();
}
public class Service : IService
{
private readonly Random _random = new Random();
public void Subscribe()
{
var a = _random.Next(0, 10) % 2421;
if(_random.Next(0, 10) % 2 != 0)
throw new AbandonedMutexException();
}
}
基于此,我想我现在理解了这个概念以及如何应用它。
【问题讨论】:
-
这个实现使用了一个计时器,其中每 n 秒/分钟执行一次操作,直到成功。
-
这是一件非常复杂的事情,它并不适合 Stack Overflow 上的答案。但是,FWIW,我的书的第 9 章讨论了如何使用带有普通装饰器的断路器,以及 Castle Windsor,其他章节包含 Unity 和 Spring.NET 的相应实现。还有完整的代码可供下载。 affiliate.manning.com/idevaffiliate.php?id=1150_236
-
@MarkSeemann 要完全理解正在发生的事情以及如何正确实施,肯定需要相当多的辅助知识。
标签: c# design-patterns dependency-injection interceptor circuit-breaker