我有一个 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/