2017-09-13 8 views
0

Droolsをブロットで使用したいのですが、LocalClusterでは正常に動作しますが、運用クラスタに配置するとエラーが発生します。 ブロットは次のとおりです。嵐のトポロジでのdroolsの使い方

public class DealLostBolt extends BaseRichBolt { 

     private static final long serialVersionUID = 1L; 

     private static final Logger LOGGER = LoggerFactory.getLogger("DEAL_LOST_BOLT"); 

     private OutputCollector collector; 

     private KieSession kieSession; 

     private FactHandle factHandle; 

     @Override 
     public void execute(Tuple input) { 
     // 获取数据 
     String sentence = (String) input.getValue(0); 
     LOGGER.info("DealLostBolt获取到的数据:" + sentence); 

     // 数据转换 
     PutDataPoint dataPoint = Json.fromJson(PutDataPoint.class, sentence); 

     KieServices ks = KieServices.Factory.get(); 
     KieContainer kieContainer = ks.getKieClasspathContainer(); 
     kieSession = kieContainer.newKieSession("all-rule"); 
     kieSession.getAgenda().getAgendaGroup("deal-lost").setFocus(); 

     factHandle = kieSession.insert(dataPoint); 
     kieSession.fireAllRules(); 
     kieSession.delete(factHandle); 

     collector.emit(new Values(sentence)); 
     } 

     @Override 
     public void declareOutputFields(OutputFieldsDeclarer declarer) { 
     declarer.declare(new Fields("value")); 

     } 

     @Override 
     public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) { 
     this.collector = collector; 
     } 

    } 

私はkiesessionを作成するために、公式文書を使用していました。 errosは次のとおりです。何かPerhapse

java.lang.RuntimeException: java.lang.NullPointerException 
    at org.apache.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:495) ~[storm-core-1.1.1.jar:1.1.1] 
    at org.apache.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:460) ~[storm-core-1.1.1.jar:1.1.1] 
    at org.apache.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:73) ~[storm-core-1.1.1.jar:1.1.1] 
    at org.apache.storm.daemon.executor$fn__5030$fn__5043$fn__5096.invoke(executor.clj:848) ~[storm-core-1.1.1.jar:1.1.1] 
    at org.apache.storm.util$async_loop$fn__557.invoke(util.clj:484) [storm-core-1.1.1.jar:1.1.1] 
    at clojure.lang.AFn.run(AFn.java:22) [clojure-1.7.0.jar:?] 
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121] 
    Caused by: java.lang.NullPointerException 
    at org.kie.internal.io.ResourceFactory.newByteArrayResource(ResourceFactory.java:66) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at org.drools.compiler.kie.builder.impl.AbstractKieModule.getResource(AbstractKieModule.java:299) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at org.drools.compiler.kie.builder.impl.AbstractKieModule.addResourceToCompiler(AbstractKieModule.java:264) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at org.drools.compiler.kie.builder.impl.AbstractKieModule.addResourceToCompiler(AbstractKieModule.java:259) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:228) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at org.drools.compiler.kie.builder.impl.AbstractKieModule.createKieBase(AbstractKieModule.java:206) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.createKieBase(KieContainerImpl.java:584) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase(KieContainerImpl.java:552) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:680) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:648) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at cn.ennwifi.storm.bolt.DealLostBolt.execute(DealLostBolt.java:52) ~[se-storm-0.0.1-SNAPSHOT-jar-with-dependencies.jar:?] 
    at org.apache.storm.daemon.executor$fn__5030$tuple_action_fn__5032.invoke(executor.clj:729) ~[storm-core-1.1.1.jar:1.1.1] 
    at org.apache.storm.daemon.executor$mk_task_receiver$fn__4951.invoke(executor.clj:461) ~[storm-core-1.1.1.jar:1.1.1] 
    at org.apache.storm.disruptor$clojure_handler$reify__4465.onEvent(disruptor.clj:40) ~[storm-core-1.1.1.jar:1.1.1] 
    at org.apache.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:482) ~[storm-core-1.1.1.jar:1.1.1] 
    ... 6 more 

は、初期化しません。 しかし、blotを実行すると新しいkieserviceが作成されます。 誰かが私を助けることができますか?

ありがとう!

答えて

0

DroolsとJMHを一緒に使用して同様の問題が発生しました。 DroolsはServiceRegistryアプローチを使用しています。つまり、Droolsライブラリ(drools-compiler、kie-ci、drools-decisiontables、...)には、それらが提供するインタフェースの実装を示す、同じ名前のプロパティファイルが含まれています。

影付きのjarプラグインは通常、(推移的な)依存関係を1つのjarファイルにフラット化します。複数回存在するファイルの場合、通常は、別の方法で指定されていなければ、その1つが選択されます。 ServiceRegistryプロパティでは、すべてのファイルを結合する必要があります。通常これはServicesResourceTransformerで行われます。このトランスフォーマーはMETA-INF/services/のファイルを処理しますが、Droolsの関連ファイルはMETA-INF/kie.confです。

<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
    <resource>META-INF/kie.conf</resource> 
</transformer> 

私は嵐の専門家ではないんだけど、Starterは、それはまた、シェードのプラグインを使用することを示唆している:JMHと私の問題はAppendingTransformerで解決することができます。私はあなたがIDEからあなたのローカルクラスタを実行すると仮定 - それは陰影の付いた瓶を使用しません。

+0

問題を解決するためにmaven-dependency-pluginを使用しました。しかし、私の方法は非常に複雑です。私は暴風雨に依存関係のジャーを置くべきです。私は方法を試して、それも私の問題を解決しました。 – zhangbo

+0

それを解決策として受け入れてください – Dennis

関連する問題