2881099/FreeScheduler

持久化任务没有在指定时间定时执行

Closed this issue · 11 comments

试用了一下这个库,发现所有持久化的任务都不会执行

测试没问题,你的代码发一下

class Program
{
    class MyTaskHandler : FreeScheduler.TaskHandlers.TestHandler
    {
        public MyTaskHandler()  { }

        public override void OnExecuting(Scheduler scheduler, TaskInfo task)
        {
            Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}] {task.Topic} 被执行,还剩 {scheduler.QuantityTask} 个循环任务");
        }
    }

    static void Main(string[] args)
    {
        Scheduler scheduler = new Scheduler(new MyTaskHandler());

        var dt = DateTime.Now;
        scheduler.AddTaskRunOnDay("持久化每日任务", "ABCD", -1, DateTime.Now.TimeOfDay.Add(new TimeSpan(0, 0, 10)).ToString(@"hh\:mm\:ss"));
        var dtts = DateTime.Now.Subtract(dt).TotalMilliseconds;
        Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}] 注册耗时 {dtts}ms,共计 {scheduler.QuantityTempTask} 个临时任务,{scheduler.QuantityTask} 个循环任务");

        Console.ReadKey();

        dtts = DateTime.Now.Subtract(dt).TotalMilliseconds;
        Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}] 耗时 {dtts}ms,还剩 {scheduler.QuantityTempTask} 个任务,{scheduler.QuantityTask} 个循环任务");
        scheduler.Dispose();
    }
}

任务处理类继承自你们仅实现了OnExecuting的那个TestHandler,因为业务上并不使用任何其他队列控制.
是否是这个问题导致?

你用的是 TestHandler ,这个是基于内存的,没有持久化,试下改成下面:

class MyTaskHandler : FreeScheduler.TaskHandlers.FreeSqlHandler
{
    public MyTaskHandler(IFreeSql fsql) : base(fsql) { }

    public override void OnExecuting(Scheduler scheduler, TaskInfo task)
    {
    Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}] {task.Topic} 被执行,还剩 {scheduler.QuantityTask} 个循环任务");

    if (task.CurrentRound > 5)
        task.Status = TaskStatus.Completed;
    }
}

_fsql = new FreeSql.FreeSqlBuilder()
    .UseConnectionString(FreeSql.DataType.Sqlite, "data source=test.db")
    .UseAutoSyncStructure(true)
    .UseNoneCommandParameter(true)
    .UseMonitorCommand(cmd => Console.WriteLine($"=========sql: {cmd.CommandText}\r\n"))
    .Build();
scheduler = new Scheduler(new MyTaskHandler(_fsql));

没有内存中的持久化吗?

内存重启就消失了,看我上面发的,把任务存储到数据库。

在我的用例里并不需要数据库永久化,仅需内存存储即可.

目前我那边的需求已经按另一种方式实现了。
这个需求就挂着吧

你说的不执行和时区有关,需要用 utc 时间,你的测试代码是本地时间,大慨率是+8

哦,还真是

早上好,已经在 readme 和 api 注释增加了utc时区说明。