Как выполнить операции db / jpa в контексте кварца? - PullRequest
0 голосов
/ 10 марта 2020

У меня есть этот сервис. Планирование задачи:

@ApplicationScoped
public class PaymentService {

    @Transactional
    public Payment scheduleNewPayment(Payment payment) throws ParseException, SchedulerException {
        Payment.persist(payment);
        JobDetail job = JobBuilder.newJob(PaymentJob.class)
                .withIdentity(String.format("job%d", payment.id), "payment-job-group")
                .build();
        Date parsed = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(payment.dueDate);
        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
                .withIdentity(String.format("trigger%d", payment.id), "trigger-group")
                .startAt(parsed)
                .forJob(job)
                .build();
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
        return payment;
    }

}

И это задание:

@ApplicationScoped
public class PaymentJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println(Payment.count());
    }

}

Но я не могу выполнить операцию с БД в контексте задания (jobExecutionContext.getScheduler ( ) .getContext (), кстати, имеет значение null).

Я запускаю свое приложение с помощью quarkus, операция гибернации происходит из Hibernate Panache, а планировщик - кварц.

1 Ответ

2 голосов
/ 11 марта 2020

Прежде всего, вы должны использовать базовый управляемый экземпляр Quartz Scheduler: @Inject org.quartz.Scheduler (я полагаю, вы используете расширение quarkus-quartz).

Другая «проблема» заключается в том, что фабрика заданий Quartz по умолчанию просто вызывает new PaymentJob(), поэтому внедрение / инициализация не выполняется. Quarkus использует только собственную фабрику для заданий, созданных для методов, помеченных @Scheduled. Если вам не нужна инъекция, просто удалите лишний @ApplicationScoped из класса PaymentJob.

Наконец, вам необходимо вручную активировать все необходимые контексты CDI. Очень вероятно, что контекст запроса необходим. Вы можете скопировать следующий фрагмент: https://github.com/quarkusio/quarkus/blob/master/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/BeanInvoker.java#L14 -L24 в ваш метод execute().

jobExecutionContext.getScheduler (). GetContext (), кстати, имеет значение null

Это действительно странно. Какое исключение / ошибку вы на самом деле получаете?

...