java - 如何让 Quartz 作业在多 ApplicationContext 环境中运行?

标签 java spring osgi quartz-scheduler applicationcontext

我有一个 Spring Web 应用程序,其 applicationContext.xml通过 ContextLoaderListener 加载在 XmlWebApplicationContext 。应用程序上下文有一个 Quartz 调度程序(用 SchedulerFactoryBean 定义,如 here ),但没有触发器或作业详细信息。

在加载此主应用程序上下文期间,我加载了一些包含它们自己的“插件”JAR pluginApplicationContext.xml文件。 每个pluginApplicationContext.xml加载到 GenericXmlApplicationContext作为主要的 child XmlWebApplicationContext .

这些插件可能包含在上面讨论的调度程序中调度的 Quartz 作业 ( QuartzJobBean )。调度必须通过 Quartz API 以编程方式完成,但这对我来说很好。当作业被触发时,它会被 Quartz 很好地实例化,因为它扩展了 QuartzJobBean ,我可以获得当前的 ApplicationContext通过setApplicationContext 。 这里的问题是我得到 XmlWebApplicationContext而不是 GenericXmlApplicationContext从中安排了工作。因此,我无法调用 getBean检索插件中定义的 bean。

我很明白为什么会发生这一切。但我找不到一个干净且可重复使用的解决方案来处理它。我已经了解过 OSGi,但我们是在现有应用程序上实现这个插件系统,而不是从头开始创建一个新应用程序,并将整个应用程序迁移到 OSGi 将需要做太多工作。你知道OSGi和其他插件框架如何处理这种情况吗?

非常感谢您的帮助

最佳答案

我不确定我是否遇到了所有这些 spring 问题,但我已经使用 OSGi 完成了这些事情。

人们常常没有意识到,您可以将 OSGi 嵌入到现有应用程序中,而无需对现有代码进行任何更改。理查德·霍尔(Richard Hall)在这里描述了它 http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html (API 100% 标准化)。

有了框架,您就可以在框架中运行您的插件了。您必须确保框架导出所有应用程序包(请参阅 org.osgi.framework.system.packages.extra 启动属性)。然后插件和应用程序可以通过服务进行通信。

我从未使用过 Quartz,但我在调度方面有一些经验。我使用类似 cron 的属性注册一个可运行服务:

   @Component(properties="cron=1 * * * *")
   public void SomeImpl implements Runnable {
     public void run() {
        ...
     }
   }

然后,您需要制作一个根据其 cron 规范调用该服务的 bundle 。

关于java - 如何让 Quartz 作业在多 ApplicationContext 环境中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9840211/

相关文章:

java - getClass 返回什么类型?

java - 在 MouseWheelMotion 事件期间窗口变为空白

java - 匹配数字后跟下划线和数字的正则表达式?

java - @PreUpdate 不适用于 Spring Data JPA

java - 解决OSGi环境下 "loader constraint violation"上的 "org.w3c.dom.Node"错误

java - 与 Domino 集成的 API

java - 从 List<T> 列表对象获取 Page<T> 页面对象

java - org.springframework.web.client.ResourceAccessException : I/O error on GET request for "http://localhost:8080/": Connection refused: connect

gradle - 如何在 Gradle 中操作 Osgi list 的生成的 Import-Package 语句?

maven - Gradle、OSGi 和 OBR(或其他存储库?)