【问题标题】:How to access EJB from a Quartz Job如何从 Quartz Job 访问 EJB
【发布时间】:2012-10-20 07:35:51
【问题描述】:

嗯,我正在使用 Quartz 在我的应用程序中安排一些我需要的作业。但是,我需要一些方法来访问我的 Job 上的 Stateful SessionBean。我知道我不能用@EJB 注入它。谁能帮我? 谢谢。

【问题讨论】:

    标签: quartz-scheduler ejb-3.1 stateful-session-bean


    【解决方案1】:

    我使用 EJB3InvokerJob 来调用我的 EJB 的方法。然后我创建了扩展 EJB3InvokerJob 的作业,放置了应该调用的 EJB 和方法的参数,然后调用 super.execute()。

    EJB3InvokerJob 可以在这里找到:http://jira.opensymphony.com/secure/attachment/13356/EJB3InvokerJob.java

    我的工作是这样的:

    public class BuscaSistecJob extends EJB3InvokerJob implements Job{
    
        private final Logger logger = Logger.getLogger(this.getClass());
    
        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDataMap dataMap = jobExecutionContext.getMergedJobDataMap();
        dataMap.put(EJB_JNDI_NAME_KEY, "java:app/JobService");
        dataMap.put(EJB_INTERFACE_NAME_KEY, "br.org.cni.pronatec.controller.service.JobServiceLocal");
        dataMap.put(EJB_METHOD_KEY, "buscaSistec");
        Object[] arguments = new Object[1];
        arguments[0] = jobExecutionContext.getTrigger().getStartTime();
        dataMap.put(EJB_ARGS_KEY, arguments);
        Class[] argumentTypes = new Class[1];
        argumentTypes[0] = Date.class;
        dataMap.put(EJB_ARG_TYPES_KEY, argumentTypes);
    
        super.execute(jobExecutionContext);
        }
    
    }
    

    而我的 EJB 是这样的:

    @Stateless
    @EJB(name="java:app/JobService", beanInterface=JobServiceLocal.class)
    public class JobService implements JobServiceLocal {
    
        @PersistenceContext
        private EntityManager entityManager;
    
        @Resource
        private UserTransaction userTransaction;
    
        @Override
        public void buscaSistec(Date dataAgendamento) {
        // Do something
        }
    

    我希望能帮助别人。

    【讨论】:

      【解决方案2】:

      一个简单的解决方案是在 Job 实现中通过 JNDI 查找 EJB。

      final Context context = new InitialContext();
      
      myService= (MyService) context
                      .lookup("java:global/my-app/myejbmodule-ejb/MyService");
      

      我在 Glassfish 3.1 上开发的当前应用程序中完成了此操作。

      【讨论】:

      • 启动服务器后,用于查找服务的 JNDI 名称将打印在控制台上。
      【解决方案3】:

      您只需在 Job 实现中通过 JNDI 查找 EJB 即可做到这一点。特别是,JNDI 名称将是:

      mappedName#name_of_businessInterface
      

      其中name_of_businessInterface 是此会话bean 的业务接口的完全限定名称。比如指定mappedName="bank",业务接口的全称是com.CheckingAccount,那么业务接口的JNDI就是bank#com.CheckingAccount

      代码示例:

      Context context = new InitialContext();
      MyService myService= (MyService) context.lookup("MyService#com.test.IMyService");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-31
        • 1970-01-01
        相关资源
        最近更新 更多