Создание объекта внутри Job в Quartz.net

103
12 декабря 2020, 17:30

Подскажите, как правильно работать с контекстом базы данных (ef core) внутри Job-ы Quartz.net

Чтобы работать с базой хочу создать _context как поле джобы. Выглядело бы это примерно так:

public class LoaderJob:IJob
{
    private PsgrContext _context;
    public Task Execute(IJobExecutionContext context)
    {
        return Task.Run(() =>
        {
            var q = _context.Photos(); //Тут уже работать с контекстом 
            Console.WriteLine("Execute");
        });
    }
    public LoaderJob()
    {
        _context = new PsgrContext();
        Console.WriteLine("Ctor Test");
    }
}

Но к сожалению, такой код:

NameValueCollection props = new NameValueCollection
            {
                {"quartz.serializer.type", "binary"}
            };
StdSchedulerFactory factory = new StdSchedulerFactory(props);
IScheduler scheduler = await factory.GetScheduler();
// and start it off
await scheduler.Start();
// define the job and tie it to our HelloJob class
IJobDetail job1 = JobBuilder.Create<LoaderJob>()
    .WithIdentity("job1", "group1")
    .Build();
// Trigger the job to run now, and then repeat every 10 seconds
ITrigger trigger1 = TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(1)
        .RepeatForever())
    .Build();
// Tell quartz to schedule the job using our trigger
var jobs = new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>();
jobs[job1] = new [] {trigger1};
await scheduler.ScheduleJobs(jobs, true);            

Вернет такой вывод:

Ctor Test
Execute
Ctor Test
Execute
Ctor Test
Execute
Ctor Test
Execute
Ctor Test
Execute
Ctor Test
Execute

Я могу передать _context в качестве параметров джобы, или использовать статические поля. Но это все не потокобезопасно.

А т.к. работа с базой из разных контекстов потокобезопасна, лучшим решением было бы проинициализировать контекст внутри джобы. Но как это сделать, я не знаю.

READ ALSO
Работа с полями экземпляра C#

Работа с полями экземпляра C#

Есть класс Options с несколькими листиками и другой класс Form1Создан экземпляр класса Options в классе Form1

87
Как связать две таблицы в sql?

Как связать две таблицы в sql?

Нужно связать фильм и пользователей, которые его смотрелиДумал насчет того, чтобы сделать связь "один ко многим" по id пользователей, но не уверен,...

135
Удаление сделки amoCRM

Удаление сделки amoCRM

как можно удалить сделку в amoCRM API для PHP?

105
Не работают миграции с DB

Не работают миграции с DB

Не работает миграция в laravel с СУБД Попытки найти самостоятельно причину не увенчались успехом , жду помощи или подсказок от всех желающих

128