gpt4 book ai didi

java - 从 Quartz 作业调用 EJB

转载 作者:行者123 更新时间:2023-11-30 01:53:31 25 4
gpt4 key购买 nike

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

public class MyJob implements Job {

@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {

InitialContext ic = new InitialContext();
MyInterface bean = null;
try {
String beanClassName = getItFromSomewhere();
bean = (MyInterface) ic.lookup("java:module/" + beanClassName );
}
catch (NamingException e) {
e.printStackTrace();
}

bean.myMethod();
}
}

这种方法正确吗?当容器不知道 Quartz 作业时 它已启动,这是一个问题吗?

最佳答案

恕我直言,一个更简洁的替代方案是通过 JobJobExecutionContext 传递 EJB 实例

准备作业

final JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(MY_INTERFACE, myInterface);

final Job myJob =
JobBuilder.newJob(MyJob.class)
.setJobData(jobDataMap)
.build();

内部Job#execute

final JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
final MyInterface myInterface = (MyInterface) jobDataMap.get(MY_INTERFACE);
<小时/>

Quartz Job 实现不应该知道它正在其中运行的所有 JavaEE 容器。从长远来看,这将简化更新代码/架构的过程。
此外,您的 Job 应该只关心其唯一的职责,而不是获取所需的依赖项。
JobDataMap 视为一种奇怪的依赖注入(inject)

关于java - 从 Quartz 作业调用 EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55231296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com