好吧,我正在使用Quartz来安排我的应用程序中需要的一些工作。但是,我需要一些方法来访问我的Job上的Stateful SessionBean。我知道我不能用@EJB注入它。谁能帮我? 感谢。
答案 0 :(得分: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
}
我期待帮助别人。
答案 1 :(得分:2)
一个简单的解决方案是在Job实现中通过JNDI查找EJB。
final Context context = new InitialContext();
myService= (MyService) context
.lookup("java:global/my-app/myejbmodule-ejb/MyService");
我在Glassfish 3.1上开发的当前应用程序中完成了这项工作。
答案 2 :(得分: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");