Quartz Scheduler 和对 Karaf 的使用依赖性不启动 OSGi 包

Quartz Scheduler and usage dependencies on Karaf not starting an OSGi bundle

我正在尝试在 Apache Karaf 上使用 Quartz Scheduler :

我在 Apache Karaf Github page 上使用了调度程序示例。

在我的 IDE 上,我执行了一个示例并且它工作正常但我无法在 Karaf 下安装和启动捆绑包。

这是包的 POM 导入和导出:

    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
    <Bundle-Version>${project.version}</Bundle-Version>
    <Export-Package>
         com.schedule*;version=${project.version}
    </Export-Package>                        
    <Import-Package>
         !com.mchange.*,
         !oracle.*,
         !org.quartz.management,
         !weblogic.*,
         !javax.transaction,
         *
    </Import-Package>
    <Private-Package>
         org.apache.karaf.scheduler.core,
         org.apache.karaf.scheduler.command.*,
         org.quartz,
         org.quartz.core.*,
         org.quartz.listeners.*,
         org.quartz.impl.*,
         org.quartz.spi.*,
         org.quartz.simpl.*,
         org.quartz.utils.*,
     </Private-Package>

问题是 Karaf 导入包和排除项。 这是 Karaf 日志:

    Caused by: java.lang.NoClassDefFoundError: org/quartz/ee/jta/JTAAnnotationAwareJobRunShellFactory
    at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1204)
    at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1519)
    at com.soprahr.hub.bc.schedule.core.SimpleSchedule.init(SimpleSchedule.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:299)
    at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:980)
    at org.apache.aries.blueprint.container.BeanRecipe.runBeanProcInit(BeanRecipe.java:736)
    ... 38 more
    Caused by: java.lang.ClassNotFoundException: org.quartz.ee.jta.JTAAnnotationAwareJobRunShellFactory not found by com.schedule. [311]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1574)
    at org.apache.felix.framework.BundleWiringImpl.access0(BundleWiringImpl.java:79)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 48 more

我无法回答您的问题,但如果它不必明确是 Quartz 调度程序,您可以使用 Apache Sling 项目中的调度程序。它在 Karaf 中工作得很好。只需以您想要的任何方式安装捆绑包,您就可以开始了。

可以找到一些 howto here

实际上 Karaf 确实有一个开箱即用的调度程序。因此,为什么不使用那个。它实际上与 SLING 提供的非常相似。 要使用它,可以使用以下命令:

通过

安装
feature:install scheduler

列出所有计划的作业:

scheduler:list

安排新工作:

scheduler:schedule

有关参数的详细信息,请查看

scheduler:schedule --help

取消工作安排:

scheduler:unschedule <name> 

感谢您的帮助,包装Quartz jar可以帮助解决这个问题并将依赖项作为jar使用。这就是为什么我们需要这些依赖项:

   <dependency>
        <groupId>org.apache.servicemix.bundles</groupId>
        <artifactId>org.apache.servicemix.bundles.quartz</artifactId>
        <version>2.2.3_1</version>
    </dependency>

    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.3</version>
    </dependency>

    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.2</version>
    </dependency>

要在 Karaf 中安装它,我们可以使用这些带有 wrap 前缀的命令:

 bundle:install wrap:mvn:c3p0/c3p0/0.9.1.2
 bundle:install mvn:org.quartz-scheduler/quartz/2.2.2
 bundle:install wrap:mvn:org.quartz-scheduler/quartz-jobs/2.2.2

我在这个页面上得到了答案:Quartz scheduler and OSGI