2017-03-26 30 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>