Quartz.net从Web API手动触发作业



我知道以前有人问过这个问题,但我想得到一个明确的确认。

我有一个Windows服务运行石英。净调度器。已创建job和Triggers

我们将有一个angular web客户端,有时需要手动启动作业。

在Web API控制器中,我有这样的代码:
var properties = new NameValueCollection
{
["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
["quartz.jobStore.useProperties"] = "true",
["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz",
["quartz.jobStore.dataSource"] = "myDS",
["quartz.jobStore.tablePrefix"] = "QRTZ_",
["quartz.dataSource.NAME.provider"] = "SqlServer",
["quartz.dataSource.NAME.connectionString"] = "Server=localhost;Database=QuartzScheduler;Uid=blahuser;Pwd=blahpwd",
["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"
};
var sched = new StdSchedulerFactory(properties).GetScheduler().Result;
var jobKey = new JobKey("DailyJob1130EST", "DailyGroup");
var jobDataMap = new JobDataMap();
jobDataMap.Add("listIds", "33333");
sched.TriggerJob(jobKey, jobDataMap);

Job Name和Group在数据库中存在。

我希望对TriggerJob的调用会导致我在windows服务中运行的调度程序启动该作业。但事实并非如此。没有任何反应,甚至没有错误。

顺便说一句,我不想使用远程处理,因为它需要完整的。net框架,并且帮助文档说它被认为是不安全的。

如果TriggerJob不工作,我想手动运行一个作业,我必须添加一个新的触发器到调度程序运行一次,或者什么?

可能还有其他方法,但我能够成功做到的一种方法是:

var sched = await new StdSchedulerFactory(properties).GetScheduler();
var jobKey = new JobKey("DailyJob1130EST", "DailyGroup");
var jobDataMap = new JobDataMap();
jobDataMap.Add("listIds", rInt.ToString());
var trig = TriggerBuilder.Create()
.WithIdentity("RunNowTrigger")
.StartAt(DateBuilder.EvenSecondDate(DateTimeOffset.UtcNow.AddSeconds(5)))
.WithDescription("Run Now Trigger")
.Build();
sched.TriggerJob(jobKey, jobDataMap);

注意:"properties"是我的NameValueCollection配置信息,我在示例代码中省略了它。这没什么不寻常的。它只是设置了jobStore、dataSource和序列化器。type和threadPool。类型的设置。

最新更新