6.2K Star 12K Fork 4K

GVPdotNET China / Furion

 / 详情

请教作业计划工厂启动和更新作业失败的正确使用

已完成
创建于  
2022-11-25 16:53

💢 特别说明:如果 Issue 没有严格按照模板编写且未提供测试源码下载或 Git 测试仓库地址,则视为无效 Issue,将无法得到答复。

Furion 版本号

哪个版本号?
V4.8.1.3

.NET SDK 版本号

  • .NET5
  • .NET6
  • .NET7

Web 项目类型

  • WebApi
  • Mvc
  • Razor Pages
  • Blazor Server
  • MinApp

操作系统和版本

  • Windows(版本)
  • Linux(版本)
  • MacOS(版本)
  • 其他(版本)

代码环境

  • 开发环境(Development)
  • 生产环境(Production)
  • 测试环境(Tests/单元测试/集成测试 )

描述你的问题

发生了什么?
在接口API中添加作业任务后,能正常启动运行,调用暂停,能暂停任务,但操作以下遇到了问题,没成功。
1、调用启动方法,任务未启动;
2、删除作业,重新添加也未启动,通过查询能看见任务是存在的;
3、更新任务也没更新成功,提示阻塞了【之前成功更新过,只是作业不是通过api添加】。

认为框架是没问题的,应该是我哪里使用方式未正确,请看下。

异常堆栈信息

异常堆栈是什么?

测试项目代码

输入图片说明

        /// <summary>
        /// 添加任务
        /// </summary>
        public void AddJob()
        {
            var jobBuilder = JobBuilder.Create<MyJob>().SetJobId("job_01").SetConcurrent(false).SetDescription("任务描述");
            var triggerBuilder = Triggers.Period(5000).SetTriggerId("trigger_01").SetDescription("触发器描述");
            _schedulerFactory.AddJob(jobBuilder, triggerBuilder);
        }
        /// <summary>
        /// 更新任务
        /// </summary>
        public void UpdateDesc()
        {
            var scheduler = _schedulerFactory.GetJob("job_01");
            var jobBuilder = scheduler.GetJobBuilder();
            scheduler.UpdateDetail(jobBuilder.SetDescription("新的描述"));
        }
        /// <summary>
        /// 暂停所有任务
        /// </summary>
        public void PauseAllJob()
        {
            _schedulerFactory.PauseAll();
        }
        /// <summary>
        /// 启动所有任务
        /// </summary>
        public void StartAllJob()
        {
            _schedulerFactory.StartAll();
        }

⚠⚠ 必须提供完整可运行且包含错误的 Git 仓库 DEMO,DEMO 提供最简单的错误逻辑代码,否则将无法得到答复。⚠⚠

您的代码下载地址?
http://1.14.156.253:8083/JobTest.zip

数据库信息

  • Sqlite
  • SqlServer
  • MySQL
  • Oracle
  • PostgreSQL
  • Firebird
  • Cosmos
  • InMemoryDatabase

期待结果

期待的结果是?


评论 (26)

忽悠我 创建了任务

收到,我一定好好测,现在,我先调整你的代码,我们再测试。

1. 构造函数

  • 您的代码
private readonly ISystemService _systemService;

private readonly ISchedulerFactory _schedulerFactory;
public SystemAppService(ISystemService systemService, ISchedulerFactory schedulerFactory)
{
    _systemService = systemService;

    _schedulerFactory = schedulerFactory;
}
  • 简化后代码
private readonly ISystemService _systemService;

private readonly ISchedulerFactory _schedulerFactory;
private IScheduler _scheduler;    // 如果都是同一个作业就可以直接用了
public SystemAppService(ISystemService systemService, ISchedulerFactory schedulerFactory)
{
    _systemService = systemService;

    _schedulerFactory = schedulerFactory;
    _schedulerFactory.TryGetJob("job_01", out _scheduler);  // 如果都是同一个作业就可以直接用了
}

2. 获取任务描述

  • 您的代码
/// <summary>
/// 获取任务描述
/// </summary>
/// <returns></returns>
public string GetDesc()
{
    var isExist = _schedulerFactory.ContainsJob("job_01");
    if (isExist)
    {
        var scheduler = _schedulerFactory.GetJob("job_01");
        return scheduler.GetJobBuilder().ConvertToJSON(NamingConventions.CamelCase).ToString();
    }
    return "NO";
}
  • 简化后代码
/// <summary>
/// 获取任务描述
/// </summary>
/// <returns></returns>
public string GetDesc()
{
    _ = _schedulerFactory.TryGetJob("job_01", out var scheduler);
    return scheduler?.ConvertToJSON() ?? "NO";
}
  • 根据 第一点 之后还可以更简单
/// <summary>
/// 获取任务描述
/// </summary>
/// <returns></returns>
public string GetDesc()
{
    return _scheduler?.ConvertToJSON() ?? "NO";
}

3. 添加任务

  • 您的代码
/// <summary>
/// 添加任务
/// </summary>
public void AddJob()
{
    var jobBuilder = JobBuilder.Create<MyJob>().SetJobId("job_01").SetConcurrent(false).SetDescription("任务描述");
    var triggerBuilder = Triggers.Period(5000).SetTriggerId("trigger_01").SetDescription("触发器描述");
    _schedulerFactory.AddJob(jobBuilder, triggerBuilder);
}
  • 简化后代码
/// <summary>
/// 添加任务
/// </summary>
public void AddJob()
{
    _schedulerFactory.AddJob(JobBuilder.Create<MyJob>()
                                       .SetJobId("job_01")
                                       .SetConcurrent(false)
                                       .SetDescription("任务描述")
                           , Triggers.Period(5000)
                                       .SetTriggerId("trigger_01")
                                       .SetDescription("触发器描述"));
}

只是简化可读性。

4. 更新任务

  • 您的代码
/// <summary>
/// 更新任务
/// </summary>
public void UpdateDesc()
{
    var scheduler = _schedulerFactory.GetJob("job_01");
    var jobBuilder = scheduler.GetJobBuilder();
    scheduler.UpdateDetail(jobBuilder.SetDescription("新的描述"));
}
  • 简化后代码
/// <summary>
/// 更新任务
/// </summary>
public void UpdateDesc()
{
    _ = _schedulerFactory.TryGetJob("job_01", out var scheduler);
    var jobBuilder = scheduler?.GetJobBuilder()
                              ?.SetDescription("新的描述");
    scheduler?.UpdateDetail(jobBuilder);
}
  • 结合 第一点
/// <summary>
/// 更新任务
/// </summary>
public void UpdateDesc()
{
    _ = _schedulerFactory.TryGetJob("job_01", out _scheduler);
    var jobBuilder = _scheduler?.GetJobBuilder()
                               ?.SetDescription("新的描述");
    _scheduler?.UpdateDetail(jobBuilder);
}

只是简化可读性。

5. 其他的没问题,贴出完整代码

using Furion.Schedule;
using Job.Core;

namespace Job.Application;

/// <summary>
/// 系统服务接口
/// </summary>
public class SystemAppService : IDynamicApiController
{
    private const string _jobId = "job_01";
    private readonly ISystemService _systemService;

    private readonly ISchedulerFactory _schedulerFactory;
    private IScheduler _scheduler;    // 如果都是同一个作业就可以直接用了
    public SystemAppService(ISystemService systemService, ISchedulerFactory schedulerFactory)
    {
        _systemService = systemService;

        _schedulerFactory = schedulerFactory;
        _schedulerFactory.TryGetJob(_jobId, out _scheduler);  // 如果都是同一个作业就可以直接用了
    }

    /// <summary>
    /// 获取任务描述
    /// </summary>
    /// <returns></returns>
    public string GetDesc()
    {
        return _scheduler?.ConvertToJSON() ?? "NO";
    }

    /// <summary>
    /// 添加任务
    /// </summary>
    public void AddJob()
    {
        _schedulerFactory.AddJob(JobBuilder.Create<MyJob>()
                               .SetJobId(_jobId)
                               .SetConcurrent(false)
                               .SetDescription("任务描述")
                   , Triggers.Period(5000)
                               .SetDescription("触发器描述"));
    }

    /// <summary>
    /// 更新任务
    /// </summary>
    public void UpdateDesc()
    {
        _ = _schedulerFactory.TryGetJob(_jobId, out _scheduler);
        var jobBuilder = _scheduler?.GetJobBuilder()
                                           ?.SetDescription("新的描述");
        _scheduler?.UpdateDetail(jobBuilder);
    }

    /// <summary>
    /// 暂停所有任务
    /// </summary>
    public void PauseAllJob()
    {
        _schedulerFactory.PauseAll();
    }

    /// <summary>
    /// 启动所有任务
    /// </summary>
    public void StartAllJob()
    {
        _schedulerFactory.StartAll();
    }

    /// <summary>
    /// 删除任务
    /// </summary>
    public void DelJob()
    {
        _schedulerFactory.RemoveJob(_jobId);
    }

    /// <summary>
    /// 暂停任务
    /// </summary>
    public void PauseJob()
    {
        _ = _schedulerFactory.TryGetJob(_jobId, out _scheduler);
        _scheduler?.Pause();
    }

    /// <summary>
    /// 启动任务
    /// </summary>
    public void StartJob()
    {
        _ = _schedulerFactory.TryGetJob(_jobId, out _scheduler);
        _scheduler?.Start();
    }
}

现在开始测试

测试1:获取任务描述

输入图片说明


测试2:添加任务

输入图片说明

输入图片说明

输入图片说明

测试正常

测试3:更新任务

输入图片说明

更新成功了,但是任务执行一次后停止执行了,不正常。

974299 monksoul 1578937227 百小僧 拥有者
回复 百小僧 拥有者

极有可能是 串行 执行出问题(改为并行之后完全正常),我先看看什么问题,解决后继续。

974299 monksoul 1578937227 百小僧 拥有者
回复 百小僧 拥有者

确实是框架的问题,已修正,接着测试:

输入图片说明

暂停和启动也可以吗

测试4:暂停所有任务

输入图片说明

测试通过

测试5:启动所有任务

输入图片说明

启动成功,但是没能接着执行,测试失败

是的,暂停后重新启动没执行,还有删除后重新添加也没执行

974299 monksoul 1578937227 百小僧 拥有者
回复 百小僧 拥有者

原来是我搞了这个新状态之后忘记判断。。。输入图片说明

974299 monksoul 1578937227 百小僧 拥有者
回复 百小僧 拥有者

测试通过

输入图片说明

输入图片说明
这个地方的状态是不是没对,前面两步都对,第三步暂停后启动,感觉不应该是1就绪状态,应该是2才对。

测试6:测试删除任务

输入图片说明

测试成功

测试7:单个暂停任务

输入图片说明

测试成功

测试8:启动单个任务

输入图片说明

测试成功

/// <summary>
/// 暂停触发器
/// </summary>
public void PauseTrigger()
{
    _scheduler.PauseTrigger(_triggerId);
}
/// <summary>
/// 启动触发器
/// </summary>
public void StartTrigger()
{
    _scheduler.StartTrigger(_triggerId);
}

顺便看下这个,暂停后启动也未运行

知道,框架的问题,我刚刚测试的结果都是修正后的,还没提交发版。

已修正,现在发布:929218f

v4.8.1.6 版本发布,已修正,感谢。

升级后替换你的代码为:

using Furion.Schedule;
using Job.Core;

namespace Job.Application;

/// <summary>
/// 系统服务接口
/// </summary>
public class SystemAppService : IDynamicApiController
{
    private const string _jobId = "job_01";
    private readonly ISystemService _systemService;

    private readonly ISchedulerFactory _schedulerFactory;
    private IScheduler _scheduler;    // 如果都是同一个作业就可以直接用了
    public SystemAppService(ISystemService systemService, ISchedulerFactory schedulerFactory)
    {
        _systemService = systemService;

        _schedulerFactory = schedulerFactory;
        _schedulerFactory.TryGetJob(_jobId, out _scheduler);  // 如果都是同一个作业就可以直接用了
    }

    /// <summary>
    /// 获取任务描述
    /// </summary>
    /// <returns></returns>
    public string GetDesc()
    {
        return _scheduler?.ConvertToJSON() ?? "NO";
    }

    /// <summary>
    /// 添加任务
    /// </summary>
    public void AddJob()
    {
        _schedulerFactory.AddJob(JobBuilder.Create<MyJob>()
                               .SetJobId(_jobId)
                               .SetConcurrent(false)
                               .SetDescription("任务描述")
                   , Triggers.Period(5000)
                               .SetDescription("触发器描述"));
    }

    /// <summary>
    /// 更新任务
    /// </summary>
    public void UpdateDesc()
    {
        _ = _schedulerFactory.TryGetJob(_jobId, out _scheduler);
        var jobBuilder = _scheduler?.GetJobBuilder()
                                           ?.SetDescription("新的描述");
        _scheduler?.UpdateDetail(jobBuilder);
    }

    /// <summary>
    /// 暂停所有任务
    /// </summary>
    public void PauseAllJob()
    {
        _schedulerFactory.PauseAll();
    }

    /// <summary>
    /// 启动所有任务
    /// </summary>
    public void StartAllJob()
    {
        _schedulerFactory.StartAll();
    }

    /// <summary>
    /// 删除任务
    /// </summary>
    public void DelJob()
    {
        _schedulerFactory.RemoveJob(_jobId);
    }

    /// <summary>
    /// 暂停任务
    /// </summary>
    public void PauseJob()
    {
        _ = _schedulerFactory.TryGetJob(_jobId, out _scheduler);
        _scheduler?.Pause();
    }

    /// <summary>
    /// 启动任务
    /// </summary>
    public void StartJob()
    {
        _ = _schedulerFactory.TryGetJob(_jobId, out _scheduler);
        _scheduler?.Start();
    }
}
百小僧 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(3)
974299 monksoul 1578937227 61753 zuohuaijun 1686997111
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion

搜索帮助