首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OSGi: java.lang.IllegalStateException:捆绑包已卸载(org.apache.servicemix.bundles.drools)

OSGi: java.lang.IllegalStateException:捆绑包已卸载(org.apache.servicemix.bundles.drools)
EN

Stack Overflow用户
提问于 2014-01-31 10:03:22
回答 2查看 2K关注 0票数 2

在卸载依赖于"org.apache.servicemix.bundles.drools/5.5.0.Final_1“的代码,然后再次安装我的包之后,以前工作的依赖于drools的代码现在抛出IllegalStateException”包已卸载“消息,但仅限于特定的drools代码,例如,当我尝试创建新会话时:

代码语言:javascript
复制
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

如果我卸载org.apache.servicemix.bundles.drools,然后重新安装,问题就解决了,但我不认为这是正确的解决方案。还有其他依赖于drools的捆绑包,这可能会干扰它们的功能。

下面是完整的堆栈跟踪:

代码语言:javascript
复制
 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代码:

代码语言:javascript
复制
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();
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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 containerJBoss Fuse 6.0

票数 0
EN

Stack Overflow用户

发布于 2014-01-31 18:18:24

我从代码here中看到的是,drools中的会话配置将类加载器存储在静态成员中。该错误指示此会话配置中的复合类加载器包含第一个(现在已卸载)包中的类加载器。删除此引用的唯一方法实际上是删除包含此引用的类(通过卸载drools)。

从代码中看,解决这个问题的方法似乎是创建自己的会话配置对象,并在该对象上设置类加载器。我不熟悉drools,但我猜您需要首先创建一个传递类加载器的KnowledgeBuilderConfiguration,然后创建一个KnowledgeBase实例,如下所示:

代码语言:javascript
复制
KnowledgeBuilderConfiguration c = 
    KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null,
        ReportingRules.class.getClassLoader();
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(c);

希望这对获得最终的解决方案有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21471256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档