2012-01-18 74 views
1

那麼,我正在使用Quartz來安排我的應用程序中需要的一些工作。但是,我需要一些方法來訪問我的Job上的有狀態SessionBean。我知道我不能用@EJB注入它。誰能幫我? 謝謝。如何從Quartz Job訪問EJB

回答

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

一個簡單的解決方案是在Job實現中通過JNDI查找EJB。

final Context context = new InitialContext(); 

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

我已經在我正在Glassfish 3.1上開發的當前應用程序中完成此操作。

+0

JNDI名稱來查找您的服務將在控制檯上,一旦你啓動服務器進行打印。 –

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");