Кварцевая работа не запускается
Я пытаюсь использовать Abp.Quartz для планирования заданий.
Работа с чистым ядром 2.2, ок 4.5
Я сделал все, как в документации здесь https://aspnetboilerplate.com/Pages/Documents/Quartz-Integration, разрешил только в методе PostInitialize.
В конце я попробовал точно так же, как в документах (запустить планировщик с контроллера).
Но это тоже не сработало. Работа не начинается.
namespace Cloud
{
[DependsOn(typeof(AbpZeroCoreModule),
typeof(AbpQuartzModule))]
public class CloudCoreModule : AbpModule
{
public override void PreInitialize()
{
}
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(typeof(CloudCoreModule)
.GetAssembly());
}
public override void PostInitialize()
{
IocManager.Resolve<IQuartzScheduleJobManager>().ScheduleAsync<ApiRequestQueues.ApiRequestProcessor>(
job =>
{
job
.WithIdentity("RevolutApiProcessor")
.WithDescription("A job witch processing request front");
},
trigger =>
{
trigger
.StartNow()
.WithSimpleSchedule(
schedule =>
{
schedule
.RepeatForever()
.WithIntervalInSeconds(5)
.Build();
});
});
}
}
}
а вот класс ApiRequestProcessor
public class ApiRequestProcessor : JobBase, ITransientDependency
{
public override async Task Execute(IJobExecutionContext context)
{
//some work
}
}
1 ответ
Лучше поздно на вечеринку, чем никогда.
Мне удалось заставить это работать, хотя и без
Abp.Quartz
упаковка. Если вы можете использовать стандартный пакет, выполните следующие действия:
- Определите и настройте свои задания как обычно в
Startup.cs
- Убедитесь, что ваш класс реализует оба
IJob
заQuartz
быть счастливым, иITransientDependency
для ASP.NET Boilerplate, чтобы быть счастливым - Очень важно, если ваш код работы использует
DbContext
в любом случае, вы должны убедиться, что[UnitOfWork]
декоратор находится в вашем классе заданий (что в любом случае важно для обеспечения того, чтобы ваши задания выполнялись атомарно и не влияли на любые другие транзакции, которые могут происходить на вашем сервере)
Вкратце, работающий базовый класс заданий может выглядеть так:
using System;
using Quartz;
namespace MyProject.MyJobService
{
[UnitOfWork]
public class SimpleJob : IJob, ITransientDependency
{
public async Task Execute(IJobExecutionContext context)
{
Console.WriteLine("Hello from quartz job!");
}
}
}
Дополнительную информацию и обсуждение можно найти здесь (также как я наконец пришел к этому решению): https://github.com/aspnetboilerplate/aspnetboilerplate/issues/3757
Если вы сомневаетесь, внимательно прочитайте, что Quartz сообщает вам в выводе приложения — обычно это дает подсказки относительно того, что не так, но я уверен, что мое решение вам подойдет.