欢迎使用WinServiceTask,注意:此框架针对开发人员。
源代码地址:http://wstask.codeplex.com/
这是一个作业调试框架,类似于Quartz.Net
一、功能摘要:
1. 启动触发时间采用开源的Quartz.Net项目的Cron表达式:"0 0 12 * * ?" 每天中午12点触发;
2. 多线程运行各任务,互不干扰;
3. 自动监视配置文件,配置文件更改后服务重启;
4. 配置Tasks.config中可以引用公用的资源;
5. 具体任务中可以引用公有资源,并加入本任务对应的相关参数;
6. 具体任务配置中加上Settings设置,方便加入一些配置信息,如果还是不能满足,那么就要自定义Extend的扩展了。
二、运行机制:
1. 每个任务做为一个独立的运行线程 隐喻:工人
2. 服务本身做为一个独立线程 隐喻:监督工人
3. 监督工人每隔 N 秒轮询一次任务,如发现任务的触发时间小于间隔N 即创建该任务并且启动该任务。
4. 启动后的任务根据启动时间于特定时间执行任务。
5. 工人工作完本身任务后自动停止。待下一轮监督工人查看时清除任务对象。
三、任务驱动UML图
四、项目内容:
1. support 调用的一些外部类库
2. CS.Scheduling.Framework 任务调度框架
3. CS.Scheduling.NUnitTests 一些测试,这个随便写的
4. CS.Task.DataTransfer 一个数据转存的任务示例(DataTableToDataTable已经完成)
5. CS.WinServiceManager WindwosService的服务管理器,这个可以算是一个分支了。用来安装和管理实现本框架的AppForm。
6. CS.WinServiceTask WindsService的实现示例,该Demo直接调用任务调度框架。
五、任务实现代码:
1. 参见CS.Task.DataTransfer.TaskDemo的示例实现及CS.Task.DataTransfer.DataTableToDataTable实用实现
2. 继承TaskProvider类后,重写protected override Result Work() 即可。
3. 如果自已扩展了Extend节点,则要重写public override void InitExtend()方法
4. 具体备置可参见Tasks.config文件
六、WindService的调试:
1. 方法一:打开控制台,拖入CS.WinService.Demo的执行程序(该程序还是WinService)加上任一参数 如:-t 后回车
2. 方法二:通过CS.WinServiceManager安装服务。启用UDP监视器查看即。
七、更新列表:
----udpate:2010-07-07---To:1.3.1 Beta2-----
1. 配置初始化功能
2. 明确补全功能,注意:补全功能是按执行结果的XML文件里的最后成功执行时间来计算下一个周期点的。修改补全时间时必须停止服务(肯定是手动大改动)。
3. Tasks.config配置中增加公用资源部分配置,这样就可以共用一些通用的资源信息了。
4. 增加所有总服务状态Task4WinService.Status,这个好像还是有问题。
5. 增加了一个默认的扩展配置保护属性Extend, 如果自定义了扩展配置后可以重写LoadExtendConfig方法 Extend.Settings"key".Value;
----udpate:2010-07-26---To:1.3.2 Beta1-----
1. 调整文件及程序集信息;
2. 重写预定义好的预定义扩展,预定义扩展是引用公有资源再加上可能的参数组成;
*3. 注意,具体任务中不要抛出异常,以免使整个服务挂起;
4. DataTableToDataTable表对表导入任务实现;
5. Tasks.config中的预扩展中Params参数加入 对<!CDATA[]> 支持,以避免手动转义特殊字符,注:text中有值时会覆盖value中的值。
本功能是基于log4net的,
log4net里有个东东,就是 UdpAppender ,通过这个Appender可以输出到UDP中.
<!--输出到UDP中-->
<appender name="UdpSender" type="log4net.Appender.UdpAppender">
<remoteAddress value="127.0.0.1" />
<remotePort value="8081" />
<layout type="log4net.Layout.PatternLayout" value="%-5level: %message%newline" />
</appender>
这样,你不用打开日志文本,也能直接通过控制台来获得日志信息. 代码是log4net帮助文档里的,保是整理了一下.写成了一个小工具而已.喜欢的下吧,呵~~~
应用场景:
设计一个任务调度系统,配置信息以XML行式保存在Tasks.config的配置文件里,该配置里不止一个任务。不同的任务,会有不同配置信息与设定。
解决方案1:使用XPath直接读
优点:1. 直接;2. 灵活(配置可以千变万化)
缺点:1. 不友好,要写一堆的读取XML数据的方法,每次有新的任务时都要重写不同的XML片断;2. 容易出错,很有可能因为写了一个错误的节点属性名称而得不到数据
解决方案2:使用对象序列化成XML文档
缺点:1. 反序列化配置时必须有定义好的类型。
优点:1. 友好,XML里的数据直接反序列化成对象的属性;2. 不容易出错,为什么呢?你肯定要先定义好类型序列化后使用,你别告诉我你是手写XML的;
现在的问题是设计一个方法,解决它的缺点。就算有不同的配置我也能给你反序列化出来。那么抽出相同的部分,这部分不是我们关注的重点了。我们关注的是,如何重现不同的配置XML为实例。因为所有的对象都是继承自object的,那么,我们把扩展部分的类型就设定为object好了。经过测试发现,反序列化后的object是XmlNode[]数组。那我们要做的就是把这个XmlNode[]数组给转换为文本,然后再客户端使用的时候,将文本与定义好的类型进行反序列化。
代码原型:
代码
[Serializable,
XmlRoot(ElementName = "configuration")]
public class XmlConfig
{
/// <summary>
/// 扩展
/// </summary>
[XmlElement("extend")]
public object Extend { get; set; }
/// <summary>
/// 获取已设定的扩展类型实例
/// </summary>
/// <typeparam name="T">扩展的类型</typeparam>
/// <returns>扩展类实例</returns>
public T GetExtend<T>() where T:class
{
return Serializer.XmlDeserializerFormText<T>(ExtendRawXml);
}
/// <summary>
/// Extend扩展的Xml片断
/// </summary>
/// <returns></returns>
protected string ExtendRawXml
{
get
{
var nodes = Extend as XmlNode[];
if (nodes == null || nodes.Length == 0)
return "<extend />";
var w = new StringWriter();
XmlWriter writer = new XmlTextWriter(w);
writer.WriteStartElement("extend");
foreach (var node in nodes)
writer.WriteRaw(node.OuterXml);
writer.WriteEndElement();
writer.Close();
return w.ToString();
}
}
}
[Serializable,
XmlRoot("extend")]
public class MyExtend
{
public int Id { get; set; }
public string Name { get; set; }
}
不能算是我的作品,只是加了个功能,懒得再开新分类了.
演示地址:http://max.cszi.com/VerifyCode.aspx
功能说明:
1. 可自定义字体
2. 可自定义最大字号
3. 可自定义随机旋转的角度
4. 可自定义前景随机噪色量
5. 可外部生成随机码,由VerifyCode类处理成图片
6. 可自定义数字与英文字母随机出现的比率
7. 可自定义验证码长度
8. 可自定义验证码背景色
9. 可自定义验证码色彩(噪点色同验证码色一致)
10. 可自定义字体
------------------------------
本人觉得用上随机角度就行了,不用前景噪点,因为这个东东会耗一定的资源
阅读全文

