Hangfire可以在不重新部署的情况下处理对计划任务的更改

时间:2016-05-23 14:09:28

标签: c# model-view-controller hangfire

我一直在使用Microsoft MVC应用程序中的Hangfire。我已经准备好编译和安排即发即弃任务,但我很惊讶我在程序运行时无法添加/删除作业。 Hangfire无法在运行时动态调度任务吗?是否有一个众所周知的框架,即使在编译或部署应用程序之后也可以安排任务,而不必在每次添加任务时都更改C#代码?

我也研究过Quartz.NET,它似乎有同样的问题。

修改

Windows任务计划程序可以允许使用GUI安排任务,而UNIX的cron可以通过编辑文件来添加或删除任务,但我正在寻找在Windows上运行的某种应用程序,允许用户在部署应用程序之后添加或删除任务。每次我想添加或删除任务时,我都不想重新编译应用程序。

2 个答案:

答案 0 :(得分:1)

正如所提出的,这个问题似乎依赖于对运动期间动态......的含义的误解。答案是"是的,"它可以在不重新部署的情况下更改任务(但这看起来并不像您真正想要的那样)。

Hangfire将为您的应用程序添加仪表板UI,如果您将其配置为这样做,但它不是端到端的任务管理应用程序本身。它旨在使您的应用程序能够安排工作,并且从调用的角度以非常不连贯的方式完成工作 - 甚至可能无法在同一台机器上完成。

它仅限于调用.NET代码,但按照定义这符合您声明的要求,即在运行时动态调度任务。"这可以响应您喜欢的应用程序中的任何事件来完成。任务也可以删除,更新和取消。

编辑后)您需要更正:任何自定义用户界面或任务文件格式的反序列化,您必须自己编写。如果您正在寻找能够为您提供UI和/或任务文件OOTB的工具,您可能需要升级到JAMS等商业产品。 (免责声明:这本身可能不具备您所需的功能 - 我没有直接使用该产品的经验,但我与之合作过的人已经从积极的角度提到过它。)

答案 1 :(得分:0)

Create an API to schedule jobs dynamically after runtime. Your API can accept input via an HTTP Get/Put/Post/Delete etc, then run an instance of anything within your code upon the API call, using the data that you give it.

For example, say you have a hard coded Task A and Task B in your code and you want to schedule them to run dynamically using different parameters. You can create an API that will run the desired task at the specified time, using the parameters that you choose.

[HttpPost]
public IHttpActionResult Post([FromBody]TaskDto task)
{
    var job = "";
    if(task.TaskName == "TaskA"){
        job = BackgroundJob.Schedule(() => RunTaskA(task.p1,task.p2), task.StartTime);
    }
    if(task.TaskName == "TaskB"){
        job = BackgroundJob.Schedule(() => RunTaskB(task.p1,task.p2), task.StartTime);
    }

    if(!string.IsNullOrWhiteSpace(task.ContinueWith) && !string.IsNullOrWhiteSpace(job)){       
        if(task.ContinueWith == "TaskB"){
            BackgroundJob.ContinueWith(job, () => RunTaskB(task.p3,task.p4));
        }
        if(task.ContinueWith == "TaskA"){
            BackgroundJob.ContinueWith(job, () => RunTaskA(task.p3,task.p4));
        }
    }
    return Ok(job)
}

Then you can call the API using a JSON POST (example using javascript)

// Sending JSON data to start scheduled task via POST
//
var xhr = new XMLHttpRequest();
var url = "https://www.example.com/api/scheduletask";
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-type", "application/json");
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        var json = JSON.parse(xhr.responseText);
    }
};
var data = JSON.stringify({"TaskName": "TaskA", "ContinueWith": "TaskB",
"StartTime": "2-26-2018 10:00 PM", "p1": "myParam1", "p2": true, 
"p3": "myParam3", "p4": false});
xhr.send(data);

And for completeness of the example here is the TaskDto class for this example

public class TaskDto
{

    public string TaskName { get; set; }
    public string ContinueWith { get; set; }
    public DateTime StartTime { get; set; }
    public string p1 { get; set; }
    public bool p2 { get; set; }
    public string p3 { get; set; }
    public bool p4 { get; set; }

}