代码之家  ›  专栏  ›  技术社区  ›  ps0604

从Quartz作业调用EJB

  •  0
  • ps0604  · 技术社区  · 6 年前

    我有一个运行在Wildfly上的Java EE应用程序,我想把它与石英调度器集成在一起。这就是我设想从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();
         }
    }
    

    这种方法正确吗?容器不知道石英的工作是什么时候 已经开始了,这是个问题吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   LppEdd    6 年前

    一个更清洁的替代品正在通过 EJB 实例通过 Job JobExecutionContext

    准备时 工作

    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);
    

    石英 工作 实现不应该完全了解它在其中运行的javaee容器。从长远来看,这将简化更新代码/体系结构的过程。
    还有,你的 工作 应该只关心它的唯一职责,而不是获取所需的依赖关系。
    想想 JobDataMap 作为一种奇怪的 依赖注入 .