2017-09-13 12 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를 만들 공식 문서를 사용했다. 하는 오류는 다음과 같습니다 뭔가 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

음영 처리 된 jar로 JMH과 함께 Drools와 비슷한 문제가 발생했습니다. Drools는 ServiceRegistry 접근 방식을 사용합니다. 이것은 Drools 라이브러리 (drools-compiler, kie-ci, drools-decisiontables, ...)가 제공하는 인터페이스의 구현을 나타내는 동일한 이름의 등록 정보 파일을 포함한다는 것을 의미합니다.

음영 처리 된 jar 플러그인은 일반적으로 (종속적 인) 종속성을 하나의 jar 파일로 병합합니다. 여러 번 존재하는 파일의 경우 대개 지정하지 않으면 그 중 하나만 선택됩니다. 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 해결 될 수있다. 음영 처리 된 jar를 사용하지 않는 IDE에서 로컬 클러스터를 실행한다고 가정합니다.

+0

감사합니다. 문제를 해결하기 위해 maven-dependency-plugin을 사용했습니다. 그러나 내 방법은 매우 복잡합니다. 종속 항아리를 폭풍우에 직접 넣어 야합니다. 방법을 시도해도 내 문제가 해결되었습니다. – zhangbo

+0

다음 해결책으로 받아 들여주세요. – Dennis