在卸载依赖于"org.apache.servicemix.bundles.drools/5.5.0.Final_1“的代码,然后再次安装我的包之后,以前工作的依赖于drools的代码现在抛出IllegalStateException”包已卸载“消息,但仅限于特定的drools代码,例如,当我尝试创建新会话时:
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
如果我卸载org.apache.servicemix.bundles.drools,然后重新安装,问题就解决了,但我不认为这是正确的解决方案。还有其他依赖于drools的捆绑包,这可能会干扰它们的功能。
下面是完整的堆栈跟踪:
java.lang.IllegalStateException: Bundle is uninstalled
at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1832)
at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:937)
at org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:99)
at org.springframework.osgi.util.BundleDelegatingClassLoader.loadClass(BundleDelegatingClassLoader.java:156)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.drools.util.CompositeClassLoader$DefaultLoader.load(CompositeClassLoader.java:204)
at org.drools.util.CompositeClassLoader$DefaultLoader.load(CompositeClassLoader.java:187)
at org.drools.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:88)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.drools.SessionConfiguration.newTimerService(SessionConfiguration.java:441)
at org.drools.time.TimerServiceFactory.getTimerService(TimerServiceFactory.java:27)
at org.drools.common.AbstractWorkingMemory.<init>(AbstractWorkingMemory.java:315)
at org.drools.common.AbstractWorkingMemory.<init>(AbstractWorkingMemory.java:246)
at org.drools.common.AbstractWorkingMemory.<init>(AbstractWorkingMemory.java:212)
at org.drools.reteoo.ReteooWorkingMemory.<init>(ReteooWorkingMemory.java:103)
at org.drools.reteoo.ReteooStatefulSession.<init>(ReteooStatefulSession.java:81)
at org.drools.reteoo.ReteooRuleBase.newStatefulSession(ReteooRuleBase.java:402)
at org.drools.reteoo.ReteooRuleBase.newStatefulSession(ReteooRuleBase.java:387)
at org.drools.impl.KnowledgeBaseImpl.newStatefulKnowledgeSession(KnowledgeBaseImpl.java:175)
at org.drools.impl.KnowledgeBaseImpl.newStatefulKnowledgeSession(KnowledgeBaseImpl.java:162)
at com.example.drools.ReportingRules.run(ReportingRules.java:78)
at com.example.uimetadata.viewknowledge.builder.ReportViewKnowledgeBuilder.build(ReportViewKnowledgeBuilder.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:390)
at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:277)
at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:250)
at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:161)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:73)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
at org.apache.camel.fabric.FabricTraceProcessor.process(FabricTraceProcessor.java:81)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:334)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:220)
at org.apache.camel.processor.interceptor.StreamCachingInterceptor.process(StreamCachingInterceptor.java:52)
at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:46)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:308)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:117)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:46)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
at org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150)
at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117)
at org.apache.camel.processor.RouteInflightRepositoryProcessor.processNext(RouteInflightRepositoryProcessor.java:48)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:73)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
at org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:275)
at org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:183)
at org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:139)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
以下是我的drools代码:
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.*;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class ReportingRules {
private static Logger logger = LoggerFactory.getLogger(ReportingRules.class);
private KnowledgeBase kbase;
private ReportingRules() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("com/example/drools/reports/reportRender.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
logger.error(error.getMessage());
}
throw new ReportRulesException("ReportRules: " + error.getMessage());
}
kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
}
public void run(ReportViewKnowledge reportViewKnowledge) {
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
FactHandle factHandle = ksession.insert(reportViewKnowledge);
ksession.fireAllRules();
}
发布于 2014-02-05 00:08:07
在我的调查中,我确定了异常的原因是,在卸载了使用"Apache ServiceMix ::bundles ::drools“包中的drools库的核心包之后,我们需要在"Apache ServiceMix ::Bundles ::drools”上调用osgi:refresh,因为包“连接”了对其依赖项的引用,并且在卸载依赖项时必须刷新。
如果我在一头扎进开发之前先阅读手册会有所帮助:)所以为了避免我的错误,这里是OSGi Alliance web site的链接,并尽可能多地了解OSGi。这个特殊的信息可以在osgi.core-4.3.0.pdf的147页7.3节中找到,这在我的例子中是正确的,因为我们运行的是基于Karaf 2.3.0 container的JBoss Fuse 6.0。
发布于 2014-01-31 18:18:24
我从代码here中看到的是,drools中的会话配置将类加载器存储在静态成员中。该错误指示此会话配置中的复合类加载器包含第一个(现在已卸载)包中的类加载器。删除此引用的唯一方法实际上是删除包含此引用的类(通过卸载drools)。
从代码中看,解决这个问题的方法似乎是创建自己的会话配置对象,并在该对象上设置类加载器。我不熟悉drools,但我猜您需要首先创建一个传递类加载器的KnowledgeBuilderConfiguration
,然后创建一个KnowledgeBase
实例,如下所示:
KnowledgeBuilderConfiguration c =
KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null,
ReportingRules.class.getClassLoader();
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(c);
希望这对获得最终的解决方案有所帮助。
https://stackoverflow.com/questions/21471256
复制相似问题