首先,我不确定我对 Hangfire 的理解是否正确。我的理解是,从客户端将一些东西放入Hangfire DB中,同时服务器正在运行和监控。当有东西从客户端传入(-->hangfire 数据库中的条目)时,我们会这样做 - 这就是我的问题出现的地方 - 在服务器端执行一些逻辑。
所以我在控制台应用程序的客户端有一份工作:
var jobId = BackgroundJob.Enqueue("download-model", () => CreateModel(new DataModel()));
//..
//..
public static string CreateModel(DataModel model)
{
model.Application = "FileApp";
model.Filename = "TestFileName.pdf";
model.Weburi = @"https://example.com/";
model.RegId = "abcd";
return JsonConvert.SerializeObject(model);
}
当我运行程序时,它进入队列`ID:51状态:排队作业:Program.CreateModel。
我想要实现的是,服务器被触发并使用 CreateModel 中的数据来下载文件。这样服务器就会在 Hangfire 数据库中查找:哦,CreateModel 在数据库中,拿它并在服务器端执行一些逻辑,例如使用给定的参数调用 ModelFileDownload。
我不知道如何实现这一目标。我从hangfire服务器仪表板得到的唯一信息是:
Job done.
//Job ID: #50
Program.CreateModel(FromJson<DataModel>("{}"));
Status Succeeded
Result: "{\"Application\":\"FileApp\",\"Filename\": ....}"
但是当客户端被触发时,我不知道如何访问它以将其放入服务器端逻辑中。
-------------- 更新 ------------
所以要分解它,这就是我认为hangfire 在运行时正在做的事情:
var jobId = BackgroundJob.Enqueue("download-model", () => CreateModel(new DataModel()));
download-model
条目,抓取它并使用数据模型构建 URL 并下载它 - 所以在我运行的服务器上:
RecurringJob.AddOrUpdate("download-model", () => DownloadFile(null), Cron.Minutely);
public static Task DownloadFile(PerformContext context)
{
var jobId = context.BackgroundJob.Id;
Console.WriteLine(jobId);
string url = "www.example.com/";
string documentId = context.RegId; //... had dummy here instead
Uri url = new System.Uri(url + documentId);
var certificate = GetCertificate();
if (certificate != null)
{
//...
DownloadServiceClient(url, certificate);
//...
}
//...
return Task.CompletedTask;
}
我真的不确定我是否理解错了
Hangfire
。
好吧,首先这不是
Hangfire
的工作原理。
当您执行
Hangfire
时,Enqueue
所做的是将作业定义保存到其自己的数据库中,然后 Hanfire
服务器拾取该作业,使用程序集扫描加载它并激活您的方法。
因此,在您的示例中,它只是对
DataModel
进行反序列化并返回 Json。
因此,为了让您的方法按预期工作 - 在作业中下载文档,您应该创建一个如下所示的作业:
public class DownloadJob
{
public Task Download(DataModel model)
{
Uri url = new System.Uri(model.Weburi + model.DocumentId);
var certificate = GetCertificate();
if (certificate != null)
{
//...
DownloadServiceClient(url, certificate);
//...
}
//...
return Task.CompletedTask;
}
}
所以你可以像这样将其排队:
BackgroundJob.Enqueue<DownloadJob>( job=> job.Download(model));
或者,如果您想将其与 Recuring Job 结合起来,那么我会将下载模型保存到数据库(通过存储库) - 在其自己的表中,例如 [dbo].[DownloadModel]。在重复作业中,我将有一种方法从数据库(通过存储库)获取模型并下载数据,更新已下载该模型数据的模型。