C# 任务调度神器 FluentScheduler

最近几天在写一些自动执行的程序,按照古老的做法就是做成exe可执行文件,并且在任务执行完自动退出。然后用Windows的Task Scheduler按照要求设置执行时间和执行频率,可以做到近乎所有能想到的执行Job。

但是有一些很频繁的任务,秒级别的,这个就实现不了了,传统的做法是只能打包成服务,安装到服务器上执行。
今天在网上突然发现了这个神器,FluentSchedule,直接在Nuget里搜索安装,调用特别方便,简直是任务调度的神器!

FluentScheduler 中 对象: IJob(工作)、Registry(注册)、Schedule(计划)

首先做一个简单的实例

using FluentScheduler;
/// <summary>
///  工作类
/// </summary>
public class MyJob : IJob
{
    public void Execute()
    {
         //编写需要工作的内容
         //比如输出一句话
         Console.WriteLine("执行工作!");
    }
}
using FluentScheduler; 
/// <summary>
///  注册表
/// </summary>
public class MyRegistry : Registry
{   
    //无参构造函数
    public MyRegistry()
    {
        //安排任务运行在一个区间
        Schedule<MyJob>().ToRunNow().AndEvery(2).Seconds(); 
        
        // 安排任务运行一次,由一个特定的时间间隔延迟。
        Schedule<MyJob>().ToRunOnceIn(5).Seconds(); 
        
        //安排一个简单的任务在一个特定的时间运行
        Schedule(() => Console.WriteLine("Timed Task - Will run every day at 9:15pm: " + DateTime.Now)).ToRunEvery(1).Days().At(21, 15);
        
        //安排一个更复杂的行动,立即运行和每月的时间间隔
        Schedule(() =>
        {
            Console.WriteLine("Complex Action Task Starts: " + DateTime.Now);
            Thread.Sleep(1000);
            Console.WriteLine("Complex Action Task Ends: " + DateTime.Now);
        }).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0); 
        
        //计划多个任务在一个单一的日程安排中运行
        Schedule<MyJob>().AndThen<MyOtherJob>().ToRunNow().AndEvery(5).Minutes();
    }
}

在ASP.NET程序的Global.asax文件中,首先初始化管理器,这样定时器就开启了。

protected void Application_Start()
 {
     JobManager.Initialize(new MyRegistry());
 }

以上是第一种写法,下面介绍第二种写法,这里执行多个任务 不同时间段

protected void Application_Start()
 {
     JobManager.AddJob(t=>t.ToRunEvery(1).Days().At(24,00));//每天的凌晨12点 执行 
     JobManager.AddJob(t => t.ToRunEvery(1).Months().OnTheLastDay().At(8,30));//每个月的最后一天早上八点半 执行
     JobManager.Start();//启动任务管理器
 }

网页自动操作:爬虫 – 获取股票信息

上次写了《自动录入机器人》后,很多朋友问我能不能帮做各种场景的问题,回答了几个问题后,总结一下:需求集中在把Excel表中数据录入系统。我在这里统一回答:只要有网页端的系统,都可以自动录入!

最近有个朋友在分析股票,把相关股票信息收集到Excel里进行分析,包括历史记录及每天的更新。每天往Excel表里更新几十支股票的信息是一个没有任何价值但是不得不去做的事情。问我能不能帮忙搞一个自动抓取股票信息,包括股票代码,日期,开盘价,收盘价,最高价,最低价以及每天的交易量。

以Tesla为例:通过Yahoo可以看到详细的历史记录https://finance.yahoo.com/quote/TSLA/history?p=TSLA

数据都有,只要把网页的xPath分析出来,写入Excel就可以了。

目前能解析xPath的工具有:

  • HtmlAgilityPack (只有一个dll文件,不用引用其它dll)
  • AngleSharp
  • DotnetSpider(国产,要引用超级多dll,有40多个)

我选用的HtmlAgilityPack,因为它简单,只引用一个dll文件就可以了。
Excel操作用的微软官方的 Microsoft.Office.Interop.Excel

软件使用:
先在Excel文件的CompanyCode表中维护你要下载的股票代码,保存关闭Excel:

运行软件:选择你刚刚保存的Excel文件,点击Download

等运行完毕后,软件自动退出

打开Excel看一下结果吧

结果还不错吧。
如果你有相同的需求,欢迎加微信免费索取软件:

区块链能干啥(1)- 金融服务

最近几天被Facebook要发行稳定币Libra的信息刷屏了。这个Libra,还没有中文名字,暂且叫它天秤币吧。
因为我一直在区块链技术和币圈混,又是一堆朋友问我,Libra是啥,看报道很神奇的东西,是不是一夜暴富的机会又来了。。。。。。

说到区块链,比特币,到现在大部分人也没搞明白是什么东西,也没看到区块链到底能干啥,我在这里简单介绍一下区块链的几个应用场景。
今天主要介绍一下,区块链能干啥之一:金融服务。
对于金融服务,区块链能优化当前的三个场景。
一,银行业金融管理
二,证券交易
三,众筹投资
下面详细介绍这三个场景。
一,银行业金融管理
银行从角色上一般可分为中央银行(央行)和普通银行。
央行的两大职能是“促进宏观经济稳定”和“维护金融稳定”,主要手段就是管理证券和利率。央行,为整个社会的金融体系提供了最终的信用担保。普通银行则是基于央行的信用,作为中介和担保方,来协助完成多方的金融交易。
银行活动主要包括发行货币、完成存贷款等功能。银行必须确保交易的确定性。传统的金融体系为了完成上述功能,采用了极其负责的软件和硬件方案,建设和维护成本都十分昂贵。即便如此,这些系统仍然存在诸多缺陷,例如延时过大,未发现的系统漏洞。
此外,商家为了完成交易,还常常需要额外的支付企业进行处理,这大大增加了金融交易的成本。
区块链的第一个特性就是交易的确定性和完整保存交易记录。能够低成本,高效率的完成传统银行的业务。
二,证券交易
证券交易包括两个环节,一个是交易执行,另外一个是交易后的处理环节。
交易环节本身比较简单,主要是有交易系统完成数据库的读写完成,包括现在的股票交易所和加密货币交易所。这个数据库的读写操作需要高性能的处理系统来支持,区块链在此并没有什么优势。这里引入一个名词叫TPS (Transaction Per Second),传统证券交易要所需的性能为10000TPS,区块链在数据的读写性能上并不占优势。
但是,中心化的验证系统极为复杂和昂贵,交易指令执行后的结算和清算环节也十分复杂,需要大量的人力成本和时间成本,并且容易出错。
区块链的去中心化优势明显,现在Nasdaq推出Nasdaq Linq,实现面向一级市场的股票交易流程。
三,众筹投资
大家很熟悉的ICO就是这个范畴,因为区块链基于算法,发币量恒定的原理,可以让投资者在公平的基础上竞争。并且大大降低了普通投资者对早期项目的参与门槛,而且提高了项目资产的流动性。

对于金融服务先讲这么多,有补充的欢迎联系我。

Flowportal BPM 邮件提醒内容

邮件中加入审批按钮:

1、在系统表BPMSysSettings中增加一行记录ItemName = ClickToProcessHTTP
ItemValue=http://www.xxx.com/BPM/XMLService/ClickToProcess.aspx

2、在流程的邮件提醒的内容里加入<%=Context.Current.CreateProcessLinks()%>

在邮件中加入,查看详细信息链接:

<a href=”http://www.xxx.com/BPM/YZSoft/Forms/Process.aspx?tid=<%=Context.Current.Task.TaskID%>&pid=<%=Context.Current.Step.StepID%>”>Details</a>

大坑:流程节点名称不能超过32个字符

VBA 链接 SQL Server 2012 报错 SSL Security error

昨天换了服务器,SQL Server也有2008换成了2012。
把2008的数据库备份,然后到2012上恢复,然后把网站的Web.Config的链接字符串改掉。
运行,成功,一切完美。
但是一个excel的VBA却无法链接到新数据库
一直提示:
Run-time error ‘-2147467259 (80004005)’:
[DBNETLIB][ConnectionOpen (SECDoClientHandshake()).]SSL Security error.

搜索了很多资料,都是说要改注册表的SSL1,SSL1.1, SSL1.2,但是并没有什么卵用。最后经过无数次试验,改一下链接字符串就OK了。

老的链接字符串:
ServerConnString = “Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;PWD=xxxxxx;Initial Catalog=MyDB;Data Source=ServerName”

试着改成了
ServerConnString = “Provider=SQLNCLI11;Persist Security Info=False;User ID=sa;PWD=xxxxxx;Initial Catalog=MyDB;Data Source=ServerName”
本地链接成功,然后就把新版本的excel发布出去了。结果用户反馈,链接不上。
然后又试着改成下面的字符串
ServerConnString = “Driver={sql server};server=ServerName;uid=sa;PWD=xxxxxx; database=MyDB; AutoTranslate=False”
完美解决问题。