我有一个在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作业,这是一个问题吗?
Imho更清洁的选择是通过EJB
的Job
传递JobExecutionContext
实例
准备Job
时
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
想象成一种奇怪的依赖注入。