Java 如何在quartz上下文中执行db/jpa操作?

Java 如何在quartz上下文中执行db/jpa操作?,java,hibernate,quarkus,quartz,Java,Hibernate,Quarkus,Quartz,我使用此服务计划任务: @ApplicationScoped 公共类付费服务{ @交易的 公共付款计划NewPayment(付款付款)异常,ScheduleException{ 付款。坚持(付款); JobDetail job=JobBuilder.newJob(PaymentJob.class) .withIdentity(String.format(“作业%d”,付款.id),“付款作业组”) .build(); 解析日期=新的简化格式(“yyyy-MM-dd HH:MM:ss”).pars

我使用此服务计划任务:

@ApplicationScoped
公共类付费服务{
@交易的
公共付款计划NewPayment(付款付款)异常,ScheduleException{
付款。坚持(付款);
JobDetail job=JobBuilder.newJob(PaymentJob.class)
.withIdentity(String.format(“作业%d”,付款.id),“付款作业组”)
.build();
解析日期=新的简化格式(“yyyy-MM-dd HH:MM:ss”).parse(payment.dueDate);
SimpleTrigger触发器=(SimpleTrigger)TriggerBuilder.newTrigger()
.withIdentity(String.format(“触发器%d”,payment.id),“触发器组”)
.startAt(已解析)
.forJob(job)
.build();
SchedulerFactory SchedulerFactory=新StdSchedulerFactory();
Scheduler Scheduler=schedulerFactory.getScheduler();
scheduleJob(作业,触发器);
scheduler.start();
退还款项;
}
}
而这份工作:

@ApplicationScoped
公共类PaymentJob实现作业{
@凌驾
public void execute(JobExecutionContext JobExecutionContext)引发JobExecutionException{
System.out.println(Payment.count());
}
}
但是我不能在作业上下文中执行DB操作(顺便说一句,jobExecutionContext.getScheduler().getContext()为null)


我正在用quarkus运行我的应用程序,hibernate操作来自hibernate Panache,调度程序是quartz。

首先,您应该使用底层托管quartz调度程序实例:
@Inject org.quartz.Scheduler
(我想您使用的是
quarkus quartz
扩展)

另一个“问题”是默认的Quartz作业工厂只调用
newPaymentJob()
,因此不执行注入/初始化。Quarkus仅对为使用
@Scheduled
注释的方法生成的作业使用自定义工厂。如果不需要注入,只需从
PaymentJob
类中删除多余的
@ApplicationScoped

最后,您需要手动激活所有必要的CDI上下文。很可能需要请求上下文。您可以将以下代码段复制到
execute()
方法中

jobExecutionContext.getScheduler().getContext()是空的


这真的很奇怪。您实际会遇到什么异常/错误?

首先,您应该使用底层托管石英调度器实例:
@Inject org.Quartz.Scheduler
(我假设您使用的是
quarkus Quartz
扩展)

另一个“问题”是默认的Quartz作业工厂只调用
newPaymentJob()
,因此不执行注入/初始化。Quarkus仅对为使用
@Scheduled
注释的方法生成的作业使用自定义工厂。如果不需要注入,只需从
PaymentJob
类中删除多余的
@ApplicationScoped

最后,您需要手动激活所有必要的CDI上下文。很可能需要请求上下文。您可以将以下代码段复制到
execute()
方法中

jobExecutionContext.getScheduler().getContext()是空的


这真的很奇怪。您实际收到的异常/错误是什么?

jobExecutionContext.getScheduler().getContext()
不是空的,抱歉。它是空的。我没有得到任何错误,它只是返回一个空列表。谢谢你的回答!我可以解决激活我的请求上下文的问题:
Arc.container().requestContext().activate()
然后获取我的bean实例:
Arc.container().instance(PaymentService.class)
Hi@gabriecunha!我也有同样的情况。。。是否可以共享一个小代码段?谢谢!!!你可以在这里访问代码:它正在工作。非常感谢你,@Gabriel。非常感谢
jobExecutionContext.getScheduler().getContext()
不是空的,抱歉。它是空的。我没有得到任何错误,它只是返回一个空列表。谢谢你的回答!我可以解决激活我的请求上下文的问题:
Arc.container().requestContext().activate()
然后获取我的bean实例:
Arc.container().instance(PaymentService.class)
Hi@gabriecunha!我也有同样的情况。。。是否可以共享一个小代码段?谢谢!!!你可以在这里访问代码:它正在工作。非常感谢你,@Gabriel。非常感谢