Java 从Quartz作业调用EJB
我有一个在Wildfly上运行的JavaEE应用程序,我想将其与Quartz调度器集成。这就是我设想从Quartz作业调用EJB的方式(因为我在编译时不知道EJB类的名称,所以我使用查找): 这种方法正确吗?容器不会知道石英的工作,当Java 从Quartz作业调用EJB,java,jakarta-ee,ejb,quartz-scheduler,Java,Jakarta Ee,Ejb,Quartz Scheduler,我有一个在Wildfly上运行的JavaEE应用程序,我想将其与Quartz调度器集成。这就是我设想从Quartz作业调用EJB的方式(因为我在编译时不知道EJB类的名称,所以我使用查找): 这种方法正确吗?容器不会知道石英的工作,当 它被启动了,这是一个问题吗?我想一个更干净的替代方案是如何通过作业的作业执行上下文传递EJB实例的 准备作业时 final JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put(MY_INTERFACE,
它被启动了,这是一个问题吗?我想一个更干净的替代方案是如何通过
作业的作业执行上下文传递EJB
实例的
准备作业时
final JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(MY_INTERFACE, myInterface);
final Job myJob =
JobBuilder.newJob(MyJob.class)
.setJobData(jobDataMap)
.build();
内部Job#执行
final JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
final MyInterface myInterface = (MyInterface) jobDataMap.get(MY_INTERFACE);
Quartz作业
实现不应该知道它在其中运行的所有JavaEE容器。从长远来看,这将简化更新代码/体系结构的过程。
此外,您的工作
应该只关注其唯一职责,而不是获取所需的依赖项。
将JobDataMap
看作一种奇怪的依赖注入。下面是GitHub上Quart'z开发人员提供的答案:
总而言之:您的方法是正确的,在MyJob类中,您正确地创建了InitialContext()来搜索要调用的EJB实例。
正如前面的回答所建议的,您不能将EJB实例放在JobContext中,因为如果在作业调度和调用之间发生服务器重启,您不能保证您想要的EJB实例将被“注入”在JobContext中。在从JobDataMap
获取接口后,如何调用bean?@ps0604与任何其他普通对象一样。这只是一个实例。在您的示例中,我没有看到对MyBean的引用,那么实例在哪里?@ps0604您是指MyInterface。构造作业时,它将插入到作业映射中。参见上文否,我的意思是实现MyInterface
的MyBean
。在作业中,我需要运行MyBean
的方法。我使用了MyInterface
,因为在编译时我不知道bean类的名称。
final JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
final MyInterface myInterface = (MyInterface) jobDataMap.get(MY_INTERFACE);