java - 从 Quartz 作业调用 EJB

标签 java jakarta-ee ejb quartz-scheduler

我有一个在 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/

相关文章:

java - 有没有办法在java中获取属性文件中某些过滤键的列表?

java - Swing JList SetCellRenderer 背景颜色不起作用

不涉及服务器的 Java EE 安全框架

jakarta-ee - Java EE 应用程序中的 `rails console`

java - 如果列表不为空,如何使用我的服务使用 Java 8 lambda/streams 删除列表中的每个元素

java - VariableDeclaratorId 和错位构造错误。安卓

java - 有没有例子展示JVM参数UnsyncloadClass是如何工作的?

Java EE : EJB Entity, Web 独立版

java - Java应用服务器线程池配置

java - 使用 EJB 实现 Runnable over Extends Thread