2

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

4

3 回答 3

4

我使用 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
    }

我希望能帮助某人。

于 2012-01-19T11:35:20.307 回答
2

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

final Context context = new InitialContext();

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

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

于 2012-03-13T10:27:53.490 回答
0

您可以通过在 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");
于 2012-06-04T17:56:00.443 回答