从Quartz作业调用EJB

问题描述 投票:1回答:1

我有一个在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作业,这是一个问题吗?

java java-ee ejb quartz-scheduler
1个回答
2
投票

Imho更清洁的选择是通过EJBJob传递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想象成一种奇怪的依赖注入。

© www.soinside.com 2019 - 2024. All rights reserved.