配置Quartz作业以使用EJBInvokerJob调用EJb

时间:2013-06-26 13:26:26

标签: websphere ejb-3.0 quartz-scheduler jndi

我需要从石英作业中调用ejb方法,因为我在查找ejb作业时遇到了麻烦。我已经定义了一个Local接口和一个无状态实现。在websphere 7上部署时,EjbInvokerJob无法在我的jndi树中找到我的组件。 这是我的石英作业定义(这是通过quartz init servlet加载的)

JobDetail jd = JobBuilder//
                    .newJob(EJBInvokerJob.class)//
                    .withIdentity("job", "group")//
                    .usingJobData(EJBInvokerJob.EJB_JNDI_NAME_KEY, "ejb/myBean")//
                    .usingJobData(EJBInvokerJob.EJB_METHOD_KEY, "update")//
                    .build();
            String cronExpr = getInitParameter("cronExpr");
            Trigger cronTrigger = TriggerBuilder//
                    .newTrigger() //
                    .forJob(jd) //
                    .startNow() //
                    .withSchedule(CronScheduleBuilder.cronSchedule(cronExpr))//
                    .build();

            Scheduler sched = StdSchedulerFactory.getDefaultScheduler();
            sched.scheduleJob(jd, cronTrigger);
            sched.start();

我的bean在它上面有这个注释

@Stateless(name = "myBean")

我应该如何绑定EJB_JNDI_NAME_KEY?在websphere中,或者我应该能够通过此配置执行此操作。我认为问题在于我缺乏jndi树知识。由于启动作业的servlet在同一个jvm中运行,因此本地接口应该足够

1 个答案:

答案 0 :(得分:0)

由于可移植的全局JNDI名称(java:global名称空间)在Java EE 6之前不可用,因此您应该将EJB绑定到组件的名称空间(在本例中为servlet)。然后可以使用java:comp/env/ejb/myBean名称执行查找。

web.xml中需要以下条目:

<ejb-local-ref>
  <ejb-ref-name>ejb/myBean</ejb-ref-name>
  <ejb-ref-type>Session</ejb-ref-type>
  <local>LOCAL_EJB_INTERFACE</local>
</ejb-local-ref>