메뉴 건너뛰기

Cloudera, BigData, Semantic IoT, Hadoop, NoSQL

Cloudera CDH/CDP 및 Hadoop EcoSystem, Semantic IoT등의 개발/운영 기술을 정리합니다. gooper@gooper.com로 문의 주세요.


Drools 슬라이딩 윈도우 예제

총관리자 2016.07.28 15:03 조회 수 : 181

---결과 값 -------------

 init session.getFactCount() = 0

speed: 602.92267

speed: 601.1532

speed: 607.839

speed: 600.9022

speed: 609.21796

speed: 602.91187

speed: 604.02515

speed: 608.272

speed: 607.80176

speed: 606.90405

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

AA001 average speed: 605.982958984375

 matched count of Fact = 10


-------sliding_rules.drl--------------

package com.gooper.drool_test;


import com.gooper.drool_test.model.FlightStatus

import com.gooper.drool_test.model.FlightControl

import com.gooper.drool_test.model.EmergencySignal


declare FlightStatus

    @role(event)

end


declare EmergencySignal

    @role(event)

end


rule "First contact"

salience 100

when

    $currentFlight : FlightStatus() from entry-point "flight-control"

    not (exists (FlightStatus(this != $currentFlight, flight == $currentFlight.flight) from entry-point "flight-control"))

    $control : FlightControl()

then

    $control.addFlight($currentFlight);

    System.out.println("First contact with Flight " + $currentFlight.getFlight());

end


rule "flight arrival"

when

    $flight : FlightStatus() from entry-point "flight-arrival"

    $control : FlightControl()

    // Obtain resources to prepare the flight landing

then

    System.out.println("Flight " + $flight.getFlight() + " arriving to " + $control.getAirport() + ". Sending instructions");

    // Send instructions to arriving flight

end


rule "flight average speed"

when

    $flight : FlightStatus() from entry-point "flight-control"

    $averageSpeed : Number(floatValue > 0) from accumulate(FlightStatus(flight==$flight.flight, $speed:speed) over window:length(5) 

                                                          from entry-point "flight-control",

                                                          average($speed))

then

    System.out.println($flight.getFlight() + " average speed: " + $averageSpeed);

end



-------------------SlidingWindow.java-----------------------

package com.gooper.drool_test;


import java.util.concurrent.TimeUnit;


import org.drools.core.time.SessionPseudoClock;

import org.kie.api.KieBase;

import org.kie.api.KieBaseConfiguration;

import org.kie.api.conf.EventProcessingOption;

import org.kie.api.io.ResourceType;

import org.kie.api.runtime.KieSession;

import org.kie.api.runtime.KieSessionConfiguration;

import org.kie.api.runtime.conf.ClockTypeOption;

import org.kie.api.runtime.rule.EntryPoint;

import org.kie.internal.KnowledgeBaseFactory;

import org.kie.internal.builder.KnowledgeBuilder;

import org.kie.internal.builder.KnowledgeBuilderFactory;

import org.kie.internal.io.ResourceFactory;


import com.gooper.drool_test.custom.CustomAgendaEventListener;

import com.gooper.drool_test.custom.CustomWorkingMemoryEventListener;

import com.gooper.drool_test.helper.FlightSimulation;

import com.gooper.drool_test.model.FlightStatus;


import org.kie.internal.builder.KnowledgeBuilderError;


/* 

 * Sliding-window test

 */

public class SlidingWindow {


public static final void main(String[] args) {

               try {


              // 지식 빌더 생성

                    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

                    

                    // 지식 빌더에 룰정의파일 설정

                    kbuilder.add(ResourceFactory. newClassPathResource("sliding_rules.drl"), ResourceType. DRL );


if (kbuilder.hasErrors()) {

if(kbuilder.getErrors().size() > 0) {

for(KnowledgeBuilderError kerror : kbuilder.getErrors()) {

System.out.println("error :" + kerror);

}

}

}

// 설정정보를 변경하기위한 config접근 정보를 얻음

KieBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();

config.setOption(EventProcessingOption.STREAM);

KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();

conf.setOption(ClockTypeOption.get("pseudo"));

// 새로운 지식 베이스 생성

                    KieBase kiebase = kbuilder.newKnowledgeBase();

                    

                    // 새로운 지식 베이스 세션 생성

                    KieSession session = kiebase.newKieSession(conf,null);

                    

                    // logger등록(팩트에 의해 생성된 엑티베이션(Activation)관련 이벤트만 로깅)

                    //session.addEventListener(new CustomAgendaEventListener());

                    

                    // logger등록(팩트의 추가/수정/제거 이벤트에 대한 정보)

                    //session.addEventListener(new CustomWorkingMemoryEventListener());

                    

                    System.out.println(" init session.getFactCount() = " + session.getFactCount());

                    

                    // SessionClock의 레퍼런스를 얻는다

                    SessionPseudoClock clock = session.getSessionClock();

                    

                    FlightSimulation flightAA001 = new FlightSimulation("AA001", "San Francisco", "Los Angeles", 270);

                    

                    for(int i = 0; i < 10; i++) {

                    FlightStatus flightStatus = flightAA001.update();

                    EntryPoint flightArrivalEntryPoint = session.getEntryPoint("flight-control");

                    flightArrivalEntryPoint.insert(flightStatus);

                    clock.advanceTime(5,  TimeUnit.MINUTES);

                    Thread.sleep(100);

                    }

                    

                    int matchedCnt = session.fireAllRules();

                    System.out.println(" matched count of Fact = " + matchedCnt);

                    

                    session.dispose();


              } catch (Throwable t) {

                     t.printStackTrace();

              }

       }

}


----------------------FlightSimulation.java------------------------

package com.gooper.drool_test.helper;


import java.util.Random;

import com.gooper.drool_test.model.FlightStatus;



/**

 * 

 * @author Lucas Amador

 * 

 */

public class FlightSimulation {


    private static final int AIRPORT_AIR_SPACE = 50;

    private Random rnd = new Random();


    private final String flight;

    private final String origin;

    private final String destination;

    private long distance;

    private boolean landed;


    public FlightSimulation(String flight, String origin, String destination, long distance) {

        this.flight = flight;

        this.origin = origin;

        this.destination = destination;

        this.distance = distance;

    }


    public FlightStatus update() {

        FlightStatus flightStatus = new FlightStatus();

        flightStatus.setFlight(flight);

        flightStatus.setDestination(destination);

        flightStatus.setOrigin(origin);

        flightStatus.setDestination(destination);

        this.distance = calculateDistance();

        flightStatus.setDistance(this.distance);

        flightStatus.setSpeed(currentSpeed());

        System.out.println("speed: " + flightStatus.getSpeed());

        return flightStatus;

    }


    private long calculateDistance() {

        if ((distance - AIRPORT_AIR_SPACE) <= AIRPORT_AIR_SPACE) {

            landed = true;

            return 0;

        }

        return distance - AIRPORT_AIR_SPACE;

    }


    private float currentSpeed() {

        return (rnd.nextFloat() * 10) + 600;

    }


    public boolean isLanded() {

        return landed;

    }


}





--------------------------FlightStatus.java--------------------
package com.gooper.drool_test.model;

import java.util.Date;

/**
 * 
 * @author Lucas Amador
 * 
 */
public class FlightStatus {

    private String flight;
    private Date timestamp;
    private String origin;
    private String destination;
    private long distance;
    private float speed;
    private boolean processed;

    public String getFlight() {
        return flight;
    }

    public void setFlight(String flight) {
        this.flight = flight;
    }

    public Date getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }

    public String getOrigin() {
        return origin;
    }

    public void setOrigin(String origin) {
        this.origin = origin;
    }

    public String getDestination() {
        return destination;
    }

    public void setDestination(String destination) {
        this.destination = destination;
    }

    public long getDistance() {
        return distance;
    }

    public void setDistance(long distance) {
        this.distance = distance;
    }

    public float getSpeed() {
        return speed;
    }

    public void setSpeed(float speed) {
        this.speed = speed;
    }

    public void setProcessed(boolean processed) {
        this.processed = processed;
    }

    public boolean getProcessed() {
        return processed;
    }

@Override
public String toString() {
return "FlightStatus [flight=" + flight + ", timestamp=" + timestamp + ", origin=" + origin + ", destination="
+ destination + ", distance=" + distance + ", speed=" + speed + ", processed=" + processed
+ ", getFlight()=" + getFlight() + ", getTimestamp()=" + getTimestamp() + ", getOrigin()=" + getOrigin()
+ ", getDestination()=" + getDestination() + ", getDistance()=" + getDistance() + ", getSpeed()="
+ getSpeed() + ", getProcessed()=" + getProcessed() + ", getClass()=" + getClass() + ", hashCode()="
+ hashCode() + ", toString()=" + super.toString() + "]";
}
    
    

}

번호 제목 날짜 조회 수
58 update를 많이 하면 heap memory가 많이 소진되고 최종적으로 OOM가 발생하는데 이에 대한 설명 2017.04.10 817
57 LUBM 개수별 hadoop HDFS data사이즈 정리 2017.04.06 210
56 protege 설명및 사용법 file 2017.04.04 3017
55 fuseki가 제공하는 web ui를 통해서 dataset를 remove->create할 경우 동일한 동일한 이름으로 지정했을때 fuseki-server.jar가 뜨지 않는 현상 2017.02.03 469
54 https://github.com/Merck/Halyard프로젝트 컴파일및 배포/테스트 2017.01.24 181
53 federated query 예제 2017.01.19 298
52 Halyard - RDF4J와 Apache HBase를 이용하여 구현된 TripleStore이며 SPARQL 1.1쿼리를 지원한다. 2016.12.29 733
51 jena의 data폴더를 hadoop nfs를 이용하여 HDFS상의 폴더에 마운트 시키고 fuseki를 통하여 inert를 시도했을때 transaction 오류 발생 2016.12.02 170
50 Jena 2.3를 Hadoop 2.7.2의 NFS로 mount하고 fuseki를 이용하여 start할때 오류 메세지 2016.12.02 1641
49 S2RDF를 이용한 다른 버젼의 github링크 2016.12.02 272
48 데이타 분석및 머신러닝에 도움이 도움이 되는 사이트 2016.11.04 433
47 How-to: Build a Complex Event Processing App on Apache Spark and Drools file 2016.10.31 358
46 동시에 많은 요청이 endpoint로 몰려서java.net.NoRouteToHostException가 발생하는 경우의 처리방법 2016.10.17 654
45 프로그래밍 언어별 딥러닝 라이브러리 정리 file 2016.10.05 312
44 모두를 위한 머신러닝과 딥러닝의 강의 file 2016.09.27 395
43 특정문자열이나 URI를 임의로 select 절에 지정하여 사용할때 사용하는 sparql 문장 2016.08.25 453
42 jena jar파일실행시 org.apache.jena.tdb.TDB.init에서 java.lang.NullPointerException발생시 조치사항 2016.08.19 401
41 Jena는 기본적으로 multi thread환경을 지원하지 않는다. 2016.08.16 310
40 [Elephas] Jena Elephas를 이용하여 Spark에서 rdfTriples의 RDD를 만들고 RDD관련 작업하는 샘플소스 2016.08.10 202
» 슬라이딩 윈도우 예제 2016.07.28 181
위로