2010-05-27 39 views
11

我一直在研究许多运行Windows服务或计划任务的应用程序。计划任务或服务的容错和可靠性的最佳实践

现在,我想确保这些应用程序具有容错性和可靠性。例如;我有一个每小时运行一次的服务。如果服务在其运行或运行时崩溃,我希望应用程序再次运行相同的时间(涉及到这些事情包括数据处理事务),以避免数据丢失。而且,我希望程序能够详细报告错误。我的目标是避免数据丢失并且不会落后于运行该程序。

我已经构建了一个用户可以导入到项目中的类库。图书馆应该保留程序运行实例的信息,即。程序读取和写入运行间隔,运行状态等信息。该数据存储在数据库中。

我很好奇,如果有一些最佳实践,使计划任务/ Windows服务容错和可靠。

编辑:我正在谈论在不同服务器上的独立任务或服务。我的目标是确保服务将继续运行,报告任何故障并从中恢复。

+0

我在想我自己! – Brandi 2010-05-27 16:11:44

+0

我发现的最好的广告是FireDaemon。不知道它是如何运行的,我现在正在检查它。但它的广告功能非常棒。 – 2010-05-27 17:53:46

+0

谢谢,我确实检查过它。我宁愿编写代码并控制它。 – DarthVader 2010-05-27 18:32:16

回答

6

我感兴趣的是其他人都这么说,但我给你,我偶然发现了几个要点:

  1. 作出未处理的异常事件处理程序。通过这种方式,您可以清理资源,写入日志文件,通过电子邮件发送管理员或任何您需要的资源,而不必让资源崩溃。

    AppDomain.CurrentDomain.UnhandledException + = new UnhandledExceptionEventHandler(AppUnhandledExceptionEventHandler);

  2. 覆盖您的应用程序主要部分中所需的任何服务库事件处理程序。 OnStart和OnStop非常重要,但还有很多其他的可以使用。 http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase%28v=VS.71%29.aspx

  3. 当心定时器。 Windows窗体计时器在服务中无法正常工作。用户System.Threading.Timers或System.Timers.Timer。 Best Timer for using in a Windows service

  4. 如果您正在更新线程,请确保在关键部分使用lock()或monitor来确保所有内容都是线程安全的。

  5. 请注意不要使用任何特定于用户的内容,因为服务在没有特定用户上下文的情况下运行。我注意到我的一些SQL连接字符串不再适用于Windows授权等等。也听说有人在映射驱动器时遇到问题。

  6. 永远不要使用UI提供服务。事实上,对于Vista和7而言,它们几乎不可能做到。它不应该要求用户交互,你可以做的最多的是发送带有WIN32函数的消息。 MSDN声称做互动服务是不好的做法。 http://msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx

  7. 出于调试目的,使服务作为控制台应用程序运行,直到您按照自己的想法运行,这是非常酷的。真棒教程:http://mycomponent.blogspot.com/2009/04/create-debug-install-windows-service-in.html

不管怎样,希望帮助一点点,但也只是一对夫妇的事情,我捅四处寻找我自己。

0

明显的东西 - 不要同时运行所有的任务。尝试安排它们,以便在任何时候只有一个任务使用一些昂贵的资源(如果可能的话)。例如,如果您需要发送新闻简报和一些特定通知,请在不同的时间安排它们。如果两个任务需要清理数据库中的某些内容,让它们运行一个又一个。

还安排任务在正常工作时间以外运行 - 明显晚上。

+0

我正在谈论的是不同服务器上的独立任务或服务。我的目标是确保该服务能够继续运行,报告任何故障并以最小或无数据丢失从其中恢复。 – DarthVader 2010-05-27 17:45:12