##分支说明##
该分支是基于BSF的基础上开发的分支。<br/>
修改内容<br/>
1)sdk以插件的形式扩展自BSF。<br/>
2)项目命名空间从Dyd.BaseService.TaskManager修改为TaskManager<br/>
3) 打包安装包,可以直接被第三方安装使用。<br/>
4)旧版本XXF.dll,则使用master分支<br/>
<br/>
直接使用**“任务调度平台安装”**下的安装包直接安装试用。<br/>
5)【新】增加redis内部即时通知功能,优化web与节点之间的通信。<br/>
6)【新】增加共享配置功能,所有任务都可以共享使用这些配置。<br/>
7)【新】节点监控任务未运行出错,导致持续报错bug。<br/>
##无法编译的问题##
git下载源码后部分开发人员无法编译的问题(挺诡异的问题),可以按照以下两种方式尝试解决:<br/>
1)改成.net 4.5 framework 再试试。<br/>
2)直接下载BSF源码进行编译<br/>
3) 给所有项目安装2.0版本的system.Net.Http包(右键解决方案→Nuget可以给所有项目安装这个包)。
原因:BSF引用的是system.Net.Http 2.0,但win8以后windows默认的NETFramework是4.5,包含的是system.Net.Http 4.0版本
## .net 简单任务调度平台 ##
用于.net dll,exe的任务的挂载,任务的隔离,调度执行,访问权限控制,监控,管理,日志,错误预警,性能分析等。
1) 平台基于quartz.net进行任务调度功能开发,采用C#代码编写, 支持corn表达式和第三方自定义的corn表达式扩展。
2) 架构以插件形式开发,具有良好的功能扩展性,稳定性,简单性,便于第三方开发人员进一步进行功能扩展。
3) 支持多节点集群,便于集群服务器的资源有效分配,任务的相互隔离。
4) 支持邮件形式的错误预警,便于运维及时处理任务异常等。
-- 车江毅 2015-06-17
## Dyd.BaseService.TaskManager源码部署须知: ##
- 1、删除各个项目中Newtonsoft.Json.dll的引用
- 2、检查各项目中XXF.dll的引用,确保引用了“引用”文件夹中的XXF.dll
- 3、执行,建模脚本.txt中的sql server脚本语句
- 4、【Dyd.BaseService.TaskManager.Web】 任务管理后台,部署此站点,修改web.config数据库的字符串连接
- 5、修改登录代码和用户权限(看源码),不用源码内部通过crm登录
- 6、【Dyd.BaseService.TaskManager.MonitorTasks】 监控任务,此任务需要重新生成,打包此此文件(原有的打包文件可以直接删除)
- 7、【Dyd.BaseService.TaskManager.WinService】 进行服务安装,修改安装包的实际路径
- 8、管理后台,可以正常访问后,请参照 “任务调度平台安装->任务调度平台部署流程(示例).xls”,来新建任务,调通任务可以正常进行,则为成功
<div>*(感谢俞忠亮同学整理)*<div>
## 开源相关群: .net 开源基础服务 851340557 ##
(大家都有本职工作,也许不能及时响应和跟踪解决问题,请谅解。)
## 参考文档
####(相关文档,请参考master分支,但master分支相对来说是比较旧的版本分支)####
- 文档\任务调度(TaskManage)实现分析.xp.docx 徐品提供
- 文档\任务调度部署-易懂版.docx 北京-谢江提供
## 任务demo示例 ##
<pre class="brush:c#;toolbar: true; auto-links: false;">using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dyd.BaseService.TaskManager.Demo
{
/// <summary>
/// 任务调度平台 任务插件的写法demo及说明
/// </summary>
public class DemoTask : XXF.BaseService.TaskManager.BaseDllTask
{
/// <summary>
/// 任务调度平台根据发布的任务时间配置,定时回调运行方法
/// 开发人员的任务插件必须要重载并该方法
/// </summary>
public override void Run()
{
/*
* this.OpenOperator 用于任务调度平台提供给第三方使用的所有api接口封装
*/
/*获取当前任务dll安装目录*/
this.OpenOperator.GetTaskInstallDirectory();
/*打印一条日志到任务调度平台,因为日志会存到平台数据库,所以日志要精简,对任务出错时有分析价值【注意:不要频繁打印无用的,非必要的,对分析无价值的日志信息】*/
this.OpenOperator.Log("这里打印一条日志到任务调度平台");
/*打印一条错误到任务调度平台,因为日志会存到平台数据库,所以日志要精简,对任务出错时有分析价值【注意:不要频繁打印无用的,非必要的,对分析无价值的日志信息】
*后续任务会有增加优先级区分,根据任务的优先级,错误的出现频率等,错误日志会定期推送到开发者邮箱和短信*/
this.OpenOperator.Error("这里打印一条错误日志到任务调度平台", new Exception("错误msg信息"));
/*从数据库获取任务的临时数据,临时数据以jason的形式保存在数据库里面,便于任务上下文的恢复和信息传递【注意:不应用于"频繁的"存储"大量的"临时数据,会操作网络耗时和数据库性能差】*/
var databasetempinfo = this.OpenOperator.GetDataBaseTempData<DemoTaskDatabaseTempInfo>();
if (databasetempinfo == null)//若任务第一次运行,可能没有临时数据。当然也可以在发布任务的时候配置临时数据也可。
{
databasetempinfo = new DemoTaskDatabaseTempInfo();
databasetempinfo.LastLogID = 0;
}
/*将任务的临时数据持久化到数据库中,临时数据以json的形式保存在数据库里面,便于任务上下文的恢复和信息传递【注意:不应用于"频繁的"存储"大量的"临时数据,会操作网络耗时和数据库性能差】
若临时数据用于下一次使用,必须要执行此方法,否则下次无法获取【注意:执行此方法,当前临时数据有可能被重置为null,便于内存资源释放】*/
this.OpenOperator.SaveDataBaseTempData(databasetempinfo);
/*从本地安装目录中获取任务的临时数据,临时数据以jason的形式保存在本地,便于任务上下文的恢复和信息传递【注意:本地临时数据一般用于保存"大量的"临时数据】*/
var localtempinfo = this.OpenOperator.GetLocalTempData<DemoTaskLocalTempInfo>();
if (localtempinfo == null)//若任务第一次运行,可能没有临时数据。当然也可以在发布任务的时候上传临时数据json至安装压缩包中也可。
{
localtempinfo = new DemoTaskLocalTempInfo();
localtempinfo.file = new byte[0];
}
/*将任务的临时数据持久化到本地安装目录中,临时数据以json的形式保存在本地安装目录里面,便于任务上下文的恢复和信息传递【注意:本地临时数据一般用于保存"大量的"临时数据】
若临时数据用于下一次使用,必须要执行此方法,否则下次可能无法获取【注意:执行此方法,当前临时数据有可能被重置为null,便于内存资源释放】*/
this.OpenOperator.SaveLocalTempData(localtempinfo);
{
string msg = "执行业务中...."+ this.AppConfig["sendmailhost"];
Debug.WriteLine(msg);
System.IO.File.AppendAllText(this.OpenOperator.GetTaskInstallDirectory()+"业务.txt", msg);
}
}
/// <summary>
/// 开发人员自测运行入口
/// 需要将项目配置为->控制台应用程序,写好Program类和Main入口函数
/// </summary>
public override void TestRun()
{
/*测试环境下任务的配置信息需要手工填写,正式环境下需要配置在任务配置中心里面*/
this.AppConfig = new XXF.BaseService.TaskManager.SystemRuntime.TaskAppConfigInfo();
this.AppConfig.Add("sendmailhost", "smtp.163.com");
this.AppConfig.Add("sendmailname", "fengyeguigui@163.com");
this.AppConfig.Add("password", "******");
base.TestRun();
}
}
/// <summary>
/// 任务调度平台之临时数据信息,用于任务上下文的信息传递。
/// 将会以json形式保存在任务调度平台数据库中,便于下一次回调运行时恢复并使用。【注意:不应用于"频繁的"存储"大量的"临时数据,会操作网络耗时和数据库性能差】
/// </summary>
public class DemoTaskDatabaseTempInfo
{
public int LastLogID { get; set; }
}
/// <summary>
/// 任务调度平台之临时数据信息,用于任务上下文的信息传递。
/// 将会以json形式保存在任务调度平台本地安装文件夹中,便于下一次回调运行时恢复并使用。【注意:本地临时数据一般用于保存"大量的"临时数据】
/// </summary>
public class DemoTaskLocalTempInfo
{
public byte[] file { get; set; }
}
}</pre>
## web后端部分截图及安装 ##
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093517_4KvA_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093517_diZM_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093517_MdYV_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093517_r7IR_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093518_4Hvd_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093518_WV03_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093518_9m4C_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093518_wmiF_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093518_zAvV_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093519_zIrW_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093519_vSpM_2379842.png"/>
</p>
<p>
<img src="http://static.oschina.net/uploads/space/2015/0925/093519_EcBE_2379842.png"/>
</p>
## 未来构想: ##
- 1) 任务故障转移: 检测到任务持续故障n次或者故障频率,判定进行异地节点/节点集群内的任务启动,可支持n次故障恢复。
- 2)任务负载均衡: 多个任务并行执行,用于高资源负载任务的多节点运行。
- 3)任务拆分: 一个父级任务可以创建多个子任务,并对任务进行管理,调度,故障恢复,预警等。
- 4)任务流程化及管理。
##.net 开源第三方开发学习路线 ##
- 路线1:下载开源源码->学习开源项目->成功部署项目(根据开源文档或者QQ群项目管理员协助)->成为QQ群相关项目管理员->了解并解决日常开源项目问题->总结并整理开源项目文档并分享给大家或推广->成为git项目的开发者和参与者
- 路线2:下载开源源码->学习开源项目->成功部署项目(根据开源文档或者QQ群项目管理员协助)->在实际使用中发现bug并提交bug给项目相关管理员
- 路线3:下载开源源码->学习开源项目->成功部署项目(根据开源文档或者QQ群项目管理员协助)->自行建立开源项目分支->提交分支新功能给项目官方开发人员->官方开发人员根据项目情况合并新功能并发布新版本
## 关于.net 开源生态圈的构想 ##
<b>.net 生态闭环</b>:官方开源项目->第三方参与学习->第三方改进并提交新功能或bug->官方合并新功能或bug->官方发布新版本<br/>
<b>为什么开源?</b> .net 开源生态本身弱,而强大是你与我不断学习,点滴分享,相互协助,共同营造良好的.net生态环境。<br/>
<b>开源理念:</b> 开源是一种态度,分享是一种精神,学习仍需坚持,进步仍需努力,.net生态圈因你我更加美好。<br/>