2017-03-26 96 views
2

我想在Apache Karaf使用Quartz调度:Quartz调度和使用依赖不启动一个OSGi包

我用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.access$400(BundleWiringImpl.java:79) 
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 48 more 

回答

2

感谢你的帮助,包装石英罐子可以帮助解决这个问题,并使用依赖作为一个罐子。这就是为什么我们需要这些依赖关系:

<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安装,我们可以用保鲜膜前缀这些命令:

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

1

我不能回答你的问题,但如果它没有明确是Quartz调度您可以使用调度从Apache吊带项目。它在卡拉夫工作得很好。只需以任何你想要的方式安装包,你就可以开始了。

有点howto可以找到here

1

其实卡拉夫确实有一个调度程序开箱即用。所以为什么不使用那个。它实际上与SLING提供的非常相似。 使用它提供以下命令:

通过

feature:install scheduler 

名单安装的所有预定作业:

scheduler:list 

安排新的工作:

scheduler:schedule 

有关详细信息参数看看

scheduler:schedule --help 

为unscheduling工作:

scheduler:unschedule <name>