2014-01-31 2 views
2

После удаления моего кода, который зависит от «org.apache.servicemix.bundles.drools/5.5.0.Final_1» и затем установить узелок снова, течет слюна зависимый код, который работал ранее в настоящее время выбрасывания IllegalStateException «Bundle деинсталлируется» сообщение, но только на конкретный код Drools, например, когда я пытаюсь создать новую сессию:OSGi: java.lang.IllegalStateException: Пакет удаляется (org.apache.servicemix.bundles.drools)

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) 

Вот мой 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(); 
    } 

ответ

0

Во время моего расследования я определил причину исключения в том, что после удаления нашего основного пакета, который использовал библиотеку drools из пакета Apache ServiceMix :: Bundles :: drools, нам нужно было вызвать osgi: refresh на «Apache ServiceMix :: Связки :: drools ", потому что связки« подключены »со ссылками на их иждивенцы и должны быть обновлены, когда зависимое будет удалено.

Это помогло бы, если бы я прочитал руководство, прежде чем прыгать головой сначала в разработку :) Итак, чтобы избежать моей ошибки, вот ссылка на OSGi Alliance web site и узнать как можно больше о OSGi. Эту конкретную информацию можно найти в разделе osgi.core-4.3.0.pdf, стр. 147, раздел 7.3, который является правильным в моем случае, поскольку мы запускаем JBoss Fuse 6.0, который основан на Karaf 2.3.0 container.

0

Что я вижу из кода here, является то, что конфигурация сеанса в Drools магазинах загрузчиков классов в статический член. Ошибка указывает, что загрузчик составного класса из этой конфигурации сеанса содержит загрузчик классов из вашего первого (теперь удалённого) пакета. Единственный способ удалить эту ссылку - это удалить класс, содержащий ссылку (путем удаления пушек).

Из кода видно, что для этого можно создать собственный объект конфигурации сеанса и задать загрузчик классов для этого объекта. Я не знаком с Drools, но я думаю, вы должны сначала создать KnowledgeBuilderConfiguration передавая загрузчик класса вашего класса, а затем создать KnowledgeBase экземпляр этого, как:

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

Надеется, что это помогает немного, чтобы получить окончательное решение.

+0

Спасибо, Арье, ты определенно ведешь меня в правильном направлении. Что мне нужно было сделать после удаления, мы должны были вызвать osgi: обновить «Apache ServiceMix :: Bundles :: drools». –

Смежные вопросы