错误后恢复资源

时间:2012-02-14 20:35:57

标签: c# dependency-injection structuremap

我目前正在构建一个通过基本Web服务接收数千条小消息的应用程序,消息被发布到消息队列(RabbitMQ)。该应用程序使用StructureMap作为其容器使用Dependancy Injection。

我有一个单独的工作者应用程序,它使用消息队列并将消息持久保存到数据库(SQL Server)。

我已将SQL Connection和RabbitMQ连接实现为单例(Thread Local)。

在一个理想的世界中,一切正常,但如果SQL Server或RabbitMQ连接中断,我需要重新打开它,或者可能部署并重新创建/重新连接资源。

我写了一个基本类作为工厂,在它返回资源之前,检查它是连接/打开/工作,如果没有,丢弃它并重新创建它 - 我不确定这是否是“最佳实践”或者如果我正在尝试解决已经解决的问题。

任何人都可以提供有关如何实现执行长期运行任务的建议,这些任务执行许多小任务(在我的情况下是单个INSERT语句),不需要对每个任务进行对象实例化,但可以优雅地从错误中恢复,例如掉线了?

RabbitMQ连接似乎很昂贵,在高工作负载期间,我可以快速耗尽句柄,所以我想重用相同的连接(每个线程)。

2 个答案:

答案 0 :(得分:0)

Enterprise Library 5.0 Integration Pack for Windows Azure包含用于临时故障处理的块。它允许您在发生错误时指定重试行为。

它的设计考虑了Windows Azure,但我确信根据它提供的内容编写自定义策略会很容易。

答案 1 :(得分:0)

您可以为具有连接池的RabbitMQ建立连接工厂。它将负责分发与任务的连接。您应该检查连接是否正常。如果没有,启动一个关闭/清除连接的新线程,然后将其返回到线程池。同时返回与用户的功能连接。

这听起来很复杂,但这是难以初始化资源的模式。

相关问题