Как получить доступ к EJB из кварцевого задания - PullRequest
2 голосов
/ 18 января 2012

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

Ответы [ 3 ]

4 голосов
/ 19 января 2012

Я использовал 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 голосов
/ 13 марта 2012

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

final Context context = new InitialContext();

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

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

0 голосов
/ 04 июня 2012

Вы можете сделать это, просто просмотрев EJB через JNDI в реализации Job.В частности, имя 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");
...