Использование CDI в Quartz Jobs - PullRequest
2 голосов
/ 27 февраля 2012

Я хотел бы знать, возможно ли использовать компоненты CDI в заданиях Quartz в переносном режиме?

Я уже пытался написать свой собственный JobFactory и т. Д., Но проблема в том, что BeanManager недоступен через JNDI, поскольку задание выполняется в неуправляемом потоке. Мой сервер приложений - Websphere 8.0.0.1, и я уже читал, что это противоречит спецификации EE6, чтобы сделать имя "java:" доступным для неуправляемых потоков.

Теперь есть два решения:

  1. Пусть Websphere создаст рабочие потоки (не знаю, как это сделать, любая помощь будет полезна)
  2. Реализация EJB и вызов метода через EJBJobInvoker

Я знаю, что когда я использую решение CDI, я не могу позволить рабочим потокам работать в другой JVM, исправьте меня, если я ошибаюсь. Чтобы оставаться масштабируемым, я должен реализовать EJB для этого? Как вы думаете, у вас когда-нибудь была эта проблема? Я также был бы признателен за различные решения или даже предложения по различным библиотекам планировщика!

Ответы [ 4 ]

3 голосов
/ 07 мая 2014

Посмотрите на Модуль планировщика DeltaSpike .

Вы можете найти последнюю версию в Центральном репозитории Maven .

1 голос
/ 02 февраля 2015

Кажется, есть быстрый и грязный способ получить CDI в локальной среде Quartz: установите свой собственный подкласс PropertySettingJobFactory в своем планировщике, который имеет свой собственный внедренный экземпляр BeanManager и выполняет следующие действия для каждой созданной работы:

        Job job = super.newJob(bundle, Scheduler);
        Class<? extends Job> clazz = job.getClass();

        if (beanManager != null) {
            CreationalContext<Job> ctx = beanManager
                .createCreationalContext(null);

            @SuppressWarnings("unchecked")
            AnnotatedType<Job> type = (AnnotatedType<Job>) beanManager
                .createAnnotatedType(clazz);

            InjectionTarget<Job> it = beanManager.createInjectionTarget(type);

            it.inject(job, ctx);
        }

Тогда @Injects будут заполнены вашими заданиями при создании.

1 голос
/ 28 февраля 2012

Вы можете взглянуть на DeltaSpike и использовать его BeanManagerProvider, или вы можете создать PortableExtension и кэшировать ссылку на BeanManager в расширении и использовать его. Не должно быть проблем с тем, чтобы все было так.

0 голосов
/ 25 августа 2013

Рассматривали ли вы CDIQI как реализацию CDI Quartz, которую вы, возможно, сможете смоделировать самостоятельно?

https://github.com/symbiont/cdiqi

Или ваша проблема в том, что вам абсолютно необходимо создавать собственные темы? CDIQI имеет асинхронное выполнение заданий, но звучит так, как будто вы хотите запускать свои удаленно на другой JVM?

...