Я заглянул в библиотеку github, упомянутую @ george-armhold, но обнаружил, что она не зрелая.
Тем не менее, я нашел другое решение.
Загляните в этот пост: DevSoap: Внедрение управляемых бобов CDI в рабочие места кварца . Он описывает класс CdiJobFactory.java
, который будет выполнять эту работу (написанный на Groovy или Scala, но не на kotlin или java).
Реализация в Java
Фабрика вакансий с поддержкой CDI
Тот же CdiJobFactory в Java:
/**
* CDI Job factory. Quartz will produce CDI managed beans.
*/
@ApplicationScoped
public class CdiJobFactory implements JobFactory {
@Inject
BeanManager beanManager;
@Override
public Job newJob(final TriggerFiredBundle bundle, final Scheduler scheduler) throws SchedulerException {
final Class<Job> jobClazz = (Class<Job>) bundle.getJobDetail().getJobClass();
final Bean<Job> bean = (Bean<Job>) beanManager.getBeans(jobClazz).stream().findAny().orElseThrow(IllegalStateException::new);
final CreationalContext<Job> ctx = beanManager.createCreationalContext(bean);
return (Job) beanManager.getReference(bean, jobClazz, ctx);
}
}
Внедрение CDI Job Factory в классы слушателей
Теперь в вашем классе Listener, который будет загружаться при запуске, выполните следующее:
@ApplicationScoped
public class Listener implements ServletContextListener {
@Inject
public Listener(final CdiJobFactory jobFactory) {
this.jobFactory = jobFactory;
}
@Override
public void contextInitialized(final ServletContextEvent servletEvent) {
LOG.info("Initializing Listener");
try {
scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.setJobFactory(jobFactory);
} catch (final SchedulerException | RuntimeException schedEx) {
LOG.error("Problem loading Quartz!", schedEx);
}
// register your jobs here
}
}
Создание рабочих мест
Посмотрите еще раз на сообщение в блоге. Просто пометьте их @Dependent
или @ApplicationScoped
(в зависимости от вашего варианта использования), и все в порядке.
Не забудьте создать два конструктора: общедоступный конструктор без аргументов и общедоступный конструктор с аннотацией @Inject
и необходимыми компонентами в качестве параметров. Я упустил первый конструктор для краткости.
Если вы собираетесь проводить тестирование с needle4j
, инъекции будут приниматься только с помеченным полем @Inject
. Но вы можете иметь оба, сварка не будет жаловаться.
Другие альтернативы
Вы также можете взглянуть на Apache Deltaspike . Он также будет обрабатывать другие реализации CDI. Это полезно, если вы запускаете свое приложение на разных серверах приложений с разными реализациями (например, JBoss, Websphere, Liberty Profile, TomEE, Glassfish и т. Д.).