2012-01-18 2 views
1

Ну, я использую Quartz для планирования некоторых заданий, которые мне нужны в моем приложении. Но мне нужен какой-то способ доступа к Sessionful SessionBean в моей работе. Я знал, что не могу вводить его с помощью @EJB. Может кто-нибудь мне помочь? Спасибо.Как получить доступ к EJB из задания кварца

ответ

4

Я использовал EJB3InvokerJob для вызова методов моего EJB. Затем я создал свои задания, которые расширяют EJB3InvokerJob, поместите параметры того, что EJB и метод он должен вызвать, а затем вызовите super.execute().

EJB3InvokerJob можно найти здесь: http://jira.opensymphony.com/secure/attachment/13356/EJB3InvokerJob.java

My Job выглядит так:

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

Простым решением будет поиск EJB через JNDI в реализации Job.

final Context context = new InitialContext(); 

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

Я сделал это в текущем приложении, которое я разрабатываю на Glassfish 3.1.

+0

имена JNDI для поиска ваших услуг будут печататься на вашей консоли, когда вы запуска сервера. –

0

вы можете сделать это просто путем поиска EJB через JNDI в реализации задания. В частности, имя JNDI будет:

mappedName#name_of_businessInterface 

где name_of_businessInterface это полное название бизнес-интерфейс данного бина сеанса. Например, если вы укажете mappedName="bank", а полное имя бизнес-интерфейса - com.CheckingAccount, то JNDI бизнес-интерфейса - bank#com.CheckingAccount.

Пример кода:

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