Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Quartz作业调用EJB_Java_Jakarta Ee_Ejb_Quartz Scheduler - Fatal编程技术网

Java 从Quartz作业调用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,

我有一个在Wildfly上运行的JavaEE应用程序,我想将其与Quartz调度器集成。这就是我设想从Quartz作业调用EJB的方式(因为我在编译时不知道EJB类的名称,所以我使用查找):

这种方法正确吗?容器不会知道石英的工作,当
它被启动了,这是一个问题吗?

我想一个更干净的替代方案是如何通过
作业的
作业执行上下文传递
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);