Слюни: Скомпилировать правила (или загрузить скомпилированные правила) не удается с неясными исключениями в JamVM - PullRequest
1 голос
/ 23 ноября 2011

Я разрабатываю фреймворк, который, как одна из его функций, позволяет роботам использовать систему на основе правил. Мы начали с Jess в качестве RBS, и теперь хотели внедрить drools (используя Drools 5.2.0 final), который работает на наших машинах разработки, работающих на OpenJDK 6.

Наш контроллер роботов работает под управлением ARM Linux и JamVM, ранее 1.4.3, но я недавно скомпилировал 1.5.4, потому что в нем отсутствовали классы, необходимые для drools. После сбоев я установил JamVM на виртуальную машину, используя те же конфигурации, что и при компиляции для контроллера, и там произошел сбой с теми же исключениями.

Небольшое исследование показало, что есть сообщения об ошибках для Drools + JamVM, но это также означает, что обычно работает .


При запуске инфраструктуры с предварительно скомпилированными правилами со следующим кодом ...

kBase = KnowledgeBaseFactory.newKnowledgeBase();

ObjectInputStream in;
Collection<KnowledgePackage> kpkgs;
try {
    in = new ObjectInputStream(Thread.currentThread().getContextClassLoader().getResourceAsStream(
            packageFile));
    kpkgs = (Collection<KnowledgePackage>) in.readObject();
    in.close();
} catch(IOException e) {
    throw new DisboticsException("Couldn't read drools knowledge package file!", e);
} catch(ClassNotFoundException e) {
    throw new DisboticsException("Drools knowledge package file didn't contain expected instance.", e);
}

kBase.addKnowledgePackages(kpkgs);
kSession = kBase.newStatefulKnowledgeSession();

... Я получил это исключение:

java.lang.UnsupportedOperationException
   at java.util.AbstractList.add(AbstractList.java:131)
   at java.util.AbstractList.add(AbstractList.java:152)
   at org.drools.rule.JavaDialectRuntimeData.write(JavaDialectRuntimeData.java:383)
   at org.drools.rule.JavaDialectRuntimeData.merge(JavaDialectRuntimeData.java:266)
   at org.drools.rule.JavaDialectRuntimeData.clone(JavaDialectRuntimeData.java:251)
   at org.drools.rule.DialectRuntimeRegistry.merge(DialectRuntimeRegistry.java:110)
   at org.drools.common.AbstractRuleBase.addPackages(AbstractRuleBase.java:496)
   at org.drools.reteoo.ReteooRuleBase.addPackages(ReteooRuleBase.java:427)
   at org.drools.impl.KnowledgeBaseImpl.addKnowledgePackages(KnowledgeBaseImpl.java:149)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:76)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)
Exception in thread "main" org.drools.RuntimeDroolsException: java.lang.UnsupportedOperationException
   at org.drools.rule.JavaDialectRuntimeData.write(JavaDialectRuntimeData.java:386)
   at org.drools.rule.JavaDialectRuntimeData.merge(JavaDialectRuntimeData.java:266)
   at org.drools.rule.JavaDialectRuntimeData.clone(JavaDialectRuntimeData.java:251)
   at org.drools.rule.DialectRuntimeRegistry.merge(DialectRuntimeRegistry.java:110)
   at org.drools.common.AbstractRuleBase.addPackages(AbstractRuleBase.java:496)
   at org.drools.reteoo.ReteooRuleBase.addPackages(ReteooRuleBase.java:427)
   at org.drools.impl.KnowledgeBaseImpl.addKnowledgePackages(KnowledgeBaseImpl.java:149)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:76)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)
Caused by: java.lang.UnsupportedOperationException
   at java.util.AbstractList.add(AbstractList.java:131)
   at java.util.AbstractList.add(AbstractList.java:152)
   at org.drools.rule.JavaDialectRuntimeData.write(JavaDialectRuntimeData.java:383)
   ...9 more

... который работает в OpenJDK. странно, оказывается, что рассматриваемый список в JavaDialectRuntimeData получен через Collections.emptyList() и никогда больше не изменяется (или так затмение предполагает ...).


При работе с голыми .drl файлами с использованием этого кода:

Properties props = new Properties();
props.put("drools.dialect.java.compiler", "JANINO");

KnowledgeBuilderConfiguration kbConfig = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(props,
        (ClassLoader[]) null);
KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbConfig);

kBuilder.add(ResourceFactory.newClassPathResource("disbotics/core/rules/drools/function.drl",
        DroolsRulesPlugin.class), ResourceType.DRL);
kBuilder.add(ResourceFactory.newClassPathResource(rulesFile, DroolsRulesPlugin.class), ResourceType.DRL);

if(kBuilder.hasErrors()) {
    String errorMessage = "";
    for(KnowledgeBuilderError error:kBuilder.getErrors())
        errorMessage = errorMessage + error.getMessage() + "\n";
    throw new DisboticsException(errorMessage);
}

kBase = KnowledgeBaseFactory.newKnowledgeBase();
kBase.addKnowledgePackages(kBuilder.getKnowledgePackages());
kSession = kBase.newStatefulKnowledgeSession();

... Я получаю следующие (неожиданные) исключения из компилятора правил:

Exception in thread "main" disbotics.core.common.DisboticsException: Line 2:8 unexpected exception at input '"mvel"'. Exception: java.lang.UnsupportedOperationException. Stack trace:
 java.lang.UnsupportedOperationException
   at java.util.AbstractList.add(AbstractList.java:131)
   at java.util.AbstractList.add(AbstractList.java:152)
   at org.drools.lang.descr.PackageDescr.addAttribute(PackageDescr.java:138)
   at org.drools.lang.api.impl.PackageDescrBuilderImpl.attribute(PackageDescrBuilderImpl.java:93)
   at org.drools.lang.ParserHelper.start(ParserHelper.java:684)
   at org.drools.lang.DRLParser.stringAttribute(DRLParser.java:1289)
   at org.drools.lang.DRLParser.attribute(DRLParser.java:1062)
   at org.drools.lang.DRLParser.statement(DRLParser.java:276)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:55)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

[ERR 107] Line 2:8 mismatched input '"mvel"' expecting one of the following tokens: '[package, import, global, declare, function, rule, query]'.
Line 4:0 unexpected exception at input 'global'. Exception: java.util.EmptyStackException. Stack trace:
 java.util.EmptyStackException
   at java.util.Stack.pop(Stack.java:109)
   at org.drools.lang.ParserHelper.popParaphrases(ParserHelper.java:421)
   at org.drools.lang.ParserHelper.end(ParserHelper.java:732)
   at org.drools.lang.DRLParser.globalStatement(DRLParser.java:401)
   at org.drools.lang.DRLParser.statement(DRLParser.java:261)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:55)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

Parser returned a null Package
Line 2:8 unexpected exception at input '"java"'. Exception: java.lang.UnsupportedOperationException. Stack trace:
 java.lang.UnsupportedOperationException
   at java.util.AbstractList.add(AbstractList.java:131)
   at java.util.AbstractList.add(AbstractList.java:152)
   at org.drools.lang.descr.PackageDescr.addAttribute(PackageDescr.java:138)
   at org.drools.lang.api.impl.PackageDescrBuilderImpl.attribute(PackageDescrBuilderImpl.java:93)
   at org.drools.lang.ParserHelper.start(ParserHelper.java:684)
   at org.drools.lang.DRLParser.stringAttribute(DRLParser.java:1289)
   at org.drools.lang.DRLParser.attribute(DRLParser.java:1062)
   at org.drools.lang.DRLParser.statement(DRLParser.java:276)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:57)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

[ERR 107] Line 2:8 mismatched input '"java"' expecting one of the following tokens: '[package, import, global, declare, function, rule, query]'.
Line 4:0 unexpected exception at input 'import'. Exception: java.util.EmptyStackException. Stack trace:
 java.util.EmptyStackException
   at java.util.Stack.pop(Stack.java:109)
   at org.drools.lang.ParserHelper.popParaphrases(ParserHelper.java:421)
   at org.drools.lang.ParserHelper.end(ParserHelper.java:732)
   at org.drools.lang.DRLParser.importStatement(DRLParser.java:349)
   at org.drools.lang.DRLParser.statement(DRLParser.java:258)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:57)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

Line 6:0 unexpected exception at input 'rule'. Exception: java.util.EmptyStackException. Stack trace:
 java.util.EmptyStackException
   at java.util.Stack.pop(Stack.java:109)
   at org.drools.lang.ParserHelper.popParaphrases(ParserHelper.java:421)
   at org.drools.lang.ParserHelper.end(ParserHelper.java:732)
   at org.drools.lang.DRLParser.rule(DRLParser.java:886)
   at org.drools.lang.DRLParser.statement(DRLParser.java:267)
   at org.drools.lang.DRLParser.compilationUnit(DRLParser.java:155)
   at org.drools.compiler.DrlParser.compile(DrlParser.java:225)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:136)
   at org.drools.compiler.DrlParser.parse(DrlParser.java:141)
   at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:352)
   at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:538)
   at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:28)
   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:57)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

Parser returned a null Package

   at disbotics.core.config.DroolsRulesPlugin.initialize(DroolsRulesPlugin.java:63)
   at disbotics.core.common.DisboticsCore.startFramework(DisboticsCore.java:109)
   at disbotics.core.common.DisboticsCore.main(DisboticsCore.java:56)

снова, компиляция правил в OpenJDK работала нормально. Мы используем Janino, и на него правильно ссылаются в пути к классам (путь к классам, используемый во время выполнения, создается сборкой Maven, поэтому содержит все файлы jar, на которые ссылается drools / janino / что-нибудь еще)


Кто-нибудь знает, что здесь происходит и / или как заставить Drools работать с JamVM?

1 Ответ

2 голосов
/ 24 ноября 2011

Собираете ли вы пакеты знаний, используя OpenJDK 1.6? а потом пытаетесь загрузить его с 1.5.4? Вы должны попробовать скомпилировать оригинальные пакеты, используя 1.5.4, и посмотреть, есть ли у вас те же ошибки.

Для трассировки стека, похоже, что вы пытаетесь добавить что-то в неизменяемый список, верно?

По сути, вы получаете исключение здесь: kBase.addKnowledgePackages (kpkgs); Правильно?

...