【问题标题】:Invoke an EJB from a Quartz job从 Quartz 作业调用 EJB
【发布时间】:2019-03-18 22:59:12
【问题描述】:

我有一个在 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 jakarta-ee ejb quartz-scheduler


    【解决方案1】:

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

    准备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 视为一种奇怪的依赖注入

    【讨论】:

    • JobDataMap得到接口后如何调用bean?
    • @ps0604 与任何其他普通对象一样。这只是一个例子。
    • 在您的示例中,我没有看到对MyBean 的引用,那么实例在哪里?
    • @ps0604 你的意思是 MyInterface。它在构建作业时插入到作业映射中。见上文
    • 不,我的意思是MyBean,它实现了MyInterface。在工作中,我需要运行MyBean 的方法。我使用了MyInterface,因为在编译时我不知道 bean 类的名称。
    【解决方案2】:

    这是 Quart'z 开发人员在 GitHub 上提供的答案:

    https://github.com/quartz-scheduler/quartz/blob/master/quartz-jobs/src/main/java/org/quartz/jobs/ee/ejb/EJBInvokerJob.java

    总结一下:您的方法是正确的,在您的 MyJob 类中,您正确地创建了 InitialContext() 来搜索您想要调用的 EJB 实例。 您不能将 EJB 的实例放在 JobContext 中,正如前面的答案所建议的那样,因为如果在 Job 的调度和它的调用之间有服务器重新启动,您无法保证您想要的 EJB 的实例将在 JobContext 中“注入”。

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 2012-01-30
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      相关资源
      最近更新 更多