我有一个执行长时间运行过程的Windows服务。它由计时器触发,整个过程可能需要几分钟才能完成。当计时器过去时,服务实例化执行各种任务的管理对象,记录结果然后退出。
我没有实现任何东西来处理服务器在进程中间关闭时的那些情况。这可能会导致一些问题。处理这个问题的最佳做法是什么?
答案 0 :(得分:0)
只能提出含糊的建议,因为我不知道你在做什么任务。
如果要做数据库的事情,那么如果没有提交,则可以回滚事务。
如果涉及某些文件操作,或许请查看有关Transactional NTFS的this文章。您可以结合使用它与TransactionScope对象来确保原子事务。
如果您正在处理Web服务,那么服务边界将决定一个事务何时开始/结束以及另一个事务开始时,使用补偿模型(如果您违反了某些事项,则需要稍后提供一种方法) ,恢复后,另一种方式通知/执行补偿脚本。(想想在线订购书籍以及如何处理延期交货,取消等)。
对于跟踪机制,请记录每个步骤和时间表,以便在发生关机时进行故障排除。
答案 1 :(得分:0)
如果你基本上描述了一个批处理过程,那么它可以让一个定时器在一定间隔内工作 - 世界上很多地方都是这样工作的。
如果长时间运行,请尝试保持您的工作单位或批次足够小,以便您的流程至少可以检查是否已发出信号停止。这将允许服务正常退出,而不是基本上忽略服务停止消息。
在你的计时器功能的某个地方,你有一个属性,IsShutdownRequired或其他一些,你的检查(假设一些循环处理)。在服务停止控制消息中将此属性设置为true,这允许您的进程通过不尝试执行更多工作而正常退出,或者如Jimmy建议的那样,在事务中回滚该工作。
理想情况下,较小的批次会比一个较大的批次更好。