0、我们这里一般称这种场景叫Job,跑超长时间的Job一般会创建一个Job Manager来管理(以C#为例);
1、每次需要跑Job的时候,不管是怎么样的Job,都需要包装在一个继承IJob对象中,IJob中需要实现几个接口,比如Job本身的任务、成功的委托(回调)、失败的委托、Progress的委托、超时设置、异常邮件、优先级、起止时间之类的。
2、一般在用户点击完某个按钮以后,后台便会创建相应的Job对象,然后将对象放进Job Manager中,Job Manager会立即返回一个Job ID(保存在数据库中)返回到前台,前台根据显示的ID指引用户去Job Manager中监视Job的执行情况。
3、Job Manager会根据Job的信息安排执行的时间、优先级,并更新数据库中对应Job的信息。
4、终端用户可以在Job Manager中监视相关的Job执行情况,输出日志等信息,也可以对Job进行相应的调度,比如强制启动、强制关闭之类的。
5、Job执行完毕以后会将输出文件、日志等信息通过Job Manager保存到指定的位置,用户可以在线浏览也可以下载归档。
6、部分Job会在执行的过程中发送邮件,不过这个不归Job Manager管理,只需要在相当的逻辑实现里写就行了。
7、这个设计在我们的系统中使用效果还不错,不过也不是原创的,
参照了.Net ThreadPool以及Oracle PeopleSoft中的作业管理器两个模型,根据我们自己的业务做了很大的简化。