【问题标题】:Using CDI in Quartz Jobs在 Quartz 作业中使用 CDI
【发布时间】:2012-02-27 14:54:55
【问题描述】:

我想知道是否可以在 Quartz 作业中以可移植的方式使用 CDI bean?

我已经尝试编写自己的 JobFactory 等,但问题是,无法通过 JNDI 使用 BeanManager,因为作业在非托管线程中运行。我的应用程序服务器是 Websphere 8.0.0.1,我已经读到将名称“java:”提供给非托管线程是违反 EE6 规范的。

我认为现在有两种解决方案:

  1. 让 Websphere 创建工作线程(不知道怎么做,任何帮助都会很好)
  2. 实现一个 EJB 并通过 EJBJobInvoker 调用方法

我知道,当我使用 CDI 解决方案时,我无法让工作线程在不同的 JVM 中运行,如果我错了,请纠正我。为了保持可扩展性,我应该为此实现一个 EJB?你怎么看,你有没有遇到过这样的问题?我也很感激不同的解决方案,甚至是对不同调度程序库的建议!

【问题讨论】:

    标签: jakarta-ee ejb quartz-scheduler cdi


    【解决方案1】:

    DeltaSpike scheduler module

    你可以在Maven Central Repository找到最新版本。

    【讨论】:

    • JFYI:链接不再有效 - 它已被移动 here。请更新 ;)
    【解决方案2】:

    您可以查看 DeltaSpike 并使用它的 BeanManagerProvider,或者您可以创建一个 PortableExtension 并在扩展中缓存对 BeanManager 的引用并使用它。这样做应该没有问题。

    【讨论】:

    • 感谢您的帮助,但只要我无法创建托管线程,至少在 websphere 中,CDI 将无法工作,因此我不会直接在该作业中使用 CDI。我决定让调度程序在不同的环境中运行,让调度程序只调用一个 web 服务。幸运的是,在 web 服务 CDI 中可用:D
    【解决方案3】:

    似乎有一种在本地 Quartz 环境中使用 CDI 的快捷方式:在调度程序中设置您自己的 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 将在您创建时填写。

    【讨论】:

      【解决方案4】:

      您是否了解过 CDIQI,它是一种 CDI Quartz 实现,您可以根据自己的模型进行建模?

      https://github.com/symbiont/cdiqi

      或者您的问题是您绝对需要创建自己的线程? CDIQI 可以异步执行作业,但听起来您想在另一个 JVM 上远程运行您的作业?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-11
        • 1970-01-01
        相关资源
        最近更新 更多