加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 需要:从数据库中的作业队列执行作业的Windows服务;通缉:

发布时间:2020-12-15 18:19:10 所属栏目:百科 来源:网络整理
导读:需要: 从数据库中的作业队列执行作业的Windows服务 通缉: 此类应用程序的示例代码,指南或最佳实践 背景: 用户将单击将向行中插入行的ashx链接. 我需要我的Windows服务定期轮询此表中的行,它应该为每一行执行一个工作单元. 重点: 这对我来说并不是一个全
需要:

>从数据库中的作业队列执行作业的Windows服务

通缉:

>此类应用程序的示例代码,指南或最佳实践

背景:

>用户将单击将向行中插入行的ashx链接.
>我需要我的Windows服务定期轮询此表中的行,它应该为每一行执行一个工作单元.

重点:

>这对我来说并不是一个全新的领域.

>编辑:您可以假设我知道如何创建Windows服务和基本数据访问.

>但我需要从头开始编写这项服务.
>我想提前知道我需要考虑的事项.
>编辑:我最担心失败的工作,争夺工作,以及保持服务运行.

解决方法

鉴于您正在处理数据库队列,由于数据库的事务性质,您可以公平地完成已经完成的工作.典型的队列驱动应用程序有一个循环:
while(1) {
 Start transction;
 Dequeue item from queue;
 process item;
 save new state of item;
 commit;
}

如果处理在中途崩溃,则事务回滚并在下次服务启动时处理该项目.

但是在数据库中编写队列实际上比你想象的要复杂得多.如果你部署一个天真的方法,你会发现你的入队和出队相互阻塞,ashx页面变得没有响应.接下来你会发现dequeue vs. dequeue是死锁,你的循环经常遇到错误1205.我强烈建议你阅读这篇文章Using Tables as Queues.

您的下一个挑战是如何将汇集率“恰到好处”.过于激进,您的数据库将从池化请求中炙手可热.太麻烦了,你的队列会在高峰期增长,而且排水太慢.您应该考虑使用完全不同的方法:使用SQL Server内置的QUEUE对象并依赖于WAITFOR(RECEIVE)语义的魔力.这允许完全轮询免费的自我调整服务行为.实际上,还有更多:您不需要服务开始.有关我正在谈论的内容的解释,请参阅Asynchronous Procedures Execution:以完全可靠的方式从Web服务调用在SQL Server中异步启动处理.最后,如果逻辑必须在C#进程中,那么您可以利用External Activator,这允许处理在独立进程中托管,而不是T-SQL过程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读