【问题标题】:OSGi: java.lang.IllegalStateException: Bundle is uninstalled (org.apache.servicemix.bundles.drools)OSGi:java.lang.IllegalStateException:捆绑已卸载(org.apache.servicemix.bundles.drools)
【发布时间】:2014-02-23 15:03:33
【问题描述】:

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

StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

如果我卸载 org.apache.servicemix.bundles.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)

这是我的流口水代码:

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();
    }

【问题讨论】:

    标签: osgi drools illegalstateexception osgi-bundle apache-servicemix


    【解决方案1】:

    在我的调查中,我确定了异常的原因是,在卸载了我们使用来自“Apache ServiceMix :: Bundles :: drools”捆绑包中的drools库的核心捆绑包后,我们需要在“Apache ServiceMix: : Bundles :: drools”,因为 bundle 是通过对其依赖项的引用“连接”的,并且必须在卸载依赖项时刷新。

    如果我在开始开发之前阅读手册会有所帮助:) 所以为了避免我的错误,这里是指向OSGi Alliance web site 的链接,并尽可能多地了解 OSGi。此特定信息可以在 osgi.core-4.3.0.pdf 第 147 页第 7.3 节中找到,这在我的情况下是正确的,因为我们正在运行基于 Karaf 2.3.0 container 的 JBoss Fuse 6.0。

    【讨论】:

      【解决方案2】:

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

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

      KnowledgeBuilderConfiguration c = 
          KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null,
              ReportingRules.class.getClassLoader();
      kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(c);
      

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

      【讨论】:

      • 谢谢 Arie,你绝对引导我走向正确的方向。卸载后我需要做的是,我们必须在“Apache ServiceMix :: Bundles :: drools”上调用 osgi:refresh。
      猜你喜欢
      • 2014-02-20
      • 2019-11-02
      • 1970-01-01
      • 2017-12-24
      • 2014-04-10
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多