我需要从石英作业中调用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中运行,因此本地接口应该足够
答案 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>