在数据库中存储计划任务并根据需要检索它们是否有任何框架/设计模式?



我想开发一个应用程序来管理由用户或核心逻辑本身分配的任务,但是这些任务不会立即被调用(甚至可能一年后)。

因此,这些任务需要以某种方式存储在数据库中。我想要一些作为调度程序(如TaskScheduler)来管理任务,但同时也与数据库交互的东西。

我很感激任何人给我指出正确的方向,一些我自己实现的设计模式或为这个确切目的编写的库。

这可以很容易地用Newtonsoft完成。

首先,声明一个表示任务工厂的接口:

public interface ITaskFactory<T> {
Task<T> CreateTask(UnserializableContext context);
}

(其中UnserializableContext是任何不能被序列化但需要在任务中引用的对象)

然后创建一个具体的类,为你必须管理的每一个不同的任务实现它,例如:

public class MultiplyTaskFactory: ITaskFactory<int> {
public int A { get; set; }
public int B { get; set; }
public Task<int> CreateTask(UnserializableContext context) {
return Task.FromResult(A * B);
}
}
public class SumTaskFactory: ITaskFactory<int> {
public int C { get; set; }
public int D { get; set; }
public Task<int> CreateTask(UnserializableContext context) {
return Task.FromResult(C + D);
}
}

为了将任务工厂存储在数据库中,我们可以将它们转换为json。

var taskFactory1 = new MultiplyTaskFactory { A = 10, B = 2 };
var taskFactory2 = new SumTaskFactory { C = 3, D = 4 };
var taskFactory1AsJson = JsonConvert.SerializeObject(taskFactory1, Formatting.Indented, new  JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
var taskFactory2AsJson = JsonConvert.SerializeObject(taskFactory2, Formatting.Indented, new  JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});

你现在可以存储taskFactory1AsJson和taskFactory2AsJson在你的数据库。

感谢TypeNameHandling。在所有设置中,您可以轻松地反序列化任务工厂,而不必担心具体类型,也不会丢失它们在存储时所具有的属性:

var taskFactory1 = JsonConvert.DeserializeObject<ITaskFactory>(taskFactory1AsJson, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
await taskFactory1.CreateTask(context);

试试Hangfire (https://www.hangfire.io)。也许有你需要的功能

这将仅限于Windows机器吗?如果是这样,请考虑这个作为Windows任务管理器托管包装器的开源项目:https://github.com/dahall/taskscheduler

你可以在你的数据库中管理额外的细节,并让Windows任务调度程序负责触发逻辑,记录历史等。

相关内容

最新更新