Вызвать EJB из кварцевого задания - PullRequest
1 голос
/ 19 марта 2019

У меня есть приложение Java EE, которое работает на Wildfly, и я хотел бы интегрировать его с Quartz Scheduler. Вот как я предполагаю вызывать EJB из задания Quartz (так как я не знаю имя класса EJB во время компиляции, я использую поиск):

public class MyJob implements Job {

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {        

        InitialContext ic = new InitialContext();
        MyInterface bean = null;
        try {
            String beanClassName  = getItFromSomewhere();
            bean = (MyInterface) ic.lookup("java:module/" + beanClassName );
        } 
        catch (NamingException e) {
            e.printStackTrace();
        }

        bean.myMethod();
     }
}

Правильный ли этот подход? Контейнер не будет знать о работе Quartz, когда это инициировано, это проблема?

1 Ответ

2 голосов
/ 19 марта 2019

Имхо, более чистая альтернатива - передать экземпляр EJB через Job 'JobExecutionContext

При подготовке Job

final JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(MY_INTERFACE, myInterface);

final Job myJob =
    JobBuilder.newJob(MyJob.class)
              .setJobData(jobDataMap)
              .build();

Внутри Job#execute

final JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
final MyInterface myInterface = (MyInterface) jobDataMap.get(MY_INTERFACE);

Реализация Quartz Job вообще не должна знать о контейнере JavaEE, в котором она работает. Это облегчит процесс обновления вашего кода / архитектуры в долгосрочной перспективе.
Кроме того, ваш Job должен заботиться только о своей единственной обязанности, а не о получении необходимых зависимостей.
Думайте о JobDataMap как о странном виде инъекций зависимости .

...