Quazrt.net 3.0 + net.core 2.0 : 触发器不开火
Quazrt.net 3.0 + net.core 2.0 : trigger not fire
我正在尝试在我的网络核心应用程序中使用 quartz.net 3.0 创建触发器并启动作业。
这是一个代码:
mycontroller.cs
public async Task<IActionResult> CreateHomeWorkReminder([FromBody] CreateHomeWorkReminderRequest request)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
_logger.LogInformation("data valid");
var dict = new Dictionary<string, object> { {nameof(CreateHomeWorkReminderRequest.UserId), request.UserId },
{nameof(CreateHomeWorkReminderRequest.HomeWorkId), request.HomeWorkId}};
await _registerJob.CreateJob<ReminderJob>(nameof(CreateHomeWorkReminder), dict, request.DateOfReminder);
_logger.LogInformation("saving ok");
return Ok(result.Result);
}
RegisterJob.cs(mycontroller.cs 中的构造函数中的 DI):
public class RegisterJob : IRegisterJob
{
ISchedulerBot bot;
public async Task CreateJob<T>(string jobName, IDictionary<string, object> map, DateTime dateOfReminder) where T : IJob
{
NameValueCollection props = new NameValueCollection
{
{ "quartz.serializer.type", "binary" }
};
StdSchedulerFactory factory = new StdSchedulerFactory(props);
// get a scheduler
IScheduler sched = await factory.GetScheduler();
await sched.Start();
var job = JobBuilder.Create<ReminderJob>().Build();
var trigger = TriggerBuilder.Create().StartNow().Build();
await sched.ScheduleJob(job, trigger);
}
}
}
和ReminderJob.cs
public class ReminderJob : IJob
{
ILogger<ReminderJob> logger;
public ReminderJob(ILogger<ReminderJob> _logger)
{
logger = _logger;
}
public Task Execute(IJobExecutionContext context)
{
var parameters = context.JobDetail.JobDataMap;
var userId = parameters.GetLongValue("UserId");
var homeWorkId = parameters.GetLongValue("HomeWorkId");
logger.LogInformation($"userId = {userId}, homeWorkId = {homeWorkId}");
return Task.FromResult(0);
}
}
我正在尝试调试我的代码,但从未转到 ReminderJob.cs 的 Execute 方法。我的错误在哪里?我应该做什么工作?感谢您的关注。
正确答案:在 Quartz 3.0 中使用 DI 是不可能的。我使用 ILogger 的 DI 删除了 ReminderJob 中的构造函数并且代码有效。
public class ReminderJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
var parameters = context.JobDetail.JobDataMap;
var userId = parameters.GetLongValue("UserId");
var homeWorkId = parameters.GetLongValue("HomeWorkId");
await System.Console.Out.WriteLineAsync("HelloJob is executing.");
}
我正在尝试在我的网络核心应用程序中使用 quartz.net 3.0 创建触发器并启动作业。 这是一个代码: mycontroller.cs
public async Task<IActionResult> CreateHomeWorkReminder([FromBody] CreateHomeWorkReminderRequest request)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
_logger.LogInformation("data valid");
var dict = new Dictionary<string, object> { {nameof(CreateHomeWorkReminderRequest.UserId), request.UserId },
{nameof(CreateHomeWorkReminderRequest.HomeWorkId), request.HomeWorkId}};
await _registerJob.CreateJob<ReminderJob>(nameof(CreateHomeWorkReminder), dict, request.DateOfReminder);
_logger.LogInformation("saving ok");
return Ok(result.Result);
}
RegisterJob.cs(mycontroller.cs 中的构造函数中的 DI):
public class RegisterJob : IRegisterJob
{
ISchedulerBot bot;
public async Task CreateJob<T>(string jobName, IDictionary<string, object> map, DateTime dateOfReminder) where T : IJob
{
NameValueCollection props = new NameValueCollection
{
{ "quartz.serializer.type", "binary" }
};
StdSchedulerFactory factory = new StdSchedulerFactory(props);
// get a scheduler
IScheduler sched = await factory.GetScheduler();
await sched.Start();
var job = JobBuilder.Create<ReminderJob>().Build();
var trigger = TriggerBuilder.Create().StartNow().Build();
await sched.ScheduleJob(job, trigger);
}
}
}
和ReminderJob.cs
public class ReminderJob : IJob
{
ILogger<ReminderJob> logger;
public ReminderJob(ILogger<ReminderJob> _logger)
{
logger = _logger;
}
public Task Execute(IJobExecutionContext context)
{
var parameters = context.JobDetail.JobDataMap;
var userId = parameters.GetLongValue("UserId");
var homeWorkId = parameters.GetLongValue("HomeWorkId");
logger.LogInformation($"userId = {userId}, homeWorkId = {homeWorkId}");
return Task.FromResult(0);
}
}
我正在尝试调试我的代码,但从未转到 ReminderJob.cs 的 Execute 方法。我的错误在哪里?我应该做什么工作?感谢您的关注。
正确答案:在 Quartz 3.0 中使用 DI 是不可能的。我使用 ILogger 的 DI 删除了 ReminderJob 中的构造函数并且代码有效。
public class ReminderJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
var parameters = context.JobDetail.JobDataMap;
var userId = parameters.GetLongValue("UserId");
var homeWorkId = parameters.GetLongValue("HomeWorkId");
await System.Console.Out.WriteLineAsync("HelloJob is executing.");
}