메뉴 건너뛰기

Cloudera, BigData, Semantic IoT, Hadoop, NoSQL

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


Drools 슬라이딩 윈도우 예제

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

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

 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() + "]";
}
    
    

}

번호 제목 날짜 조회 수
270 mybais #과 $의 차이점 2015.11.10 3674
269 Current heap configuration for MemStore and BlockCache exceeds the threshold required for successful cluster operation 2017.07.18 3665
268 Windows7 64bit 환경에서 ElasticSearch 5.6.3설치하기 2017.10.13 3663
267 sentry설정후 beeline으로 hive2server에 접속하여 admin계정에 admin권한 부여하기 2018.07.03 3659
266 호튼웍스 하둡을 검색엔진과 연동하는 방법과 아키텍쳐 2014.09.25 3657
265 ubuntu 12.4에서 eclipse설치후 기동시 library(swt-gtk*)관련 오류 2014.04.23 3652
264 우분투 서버에 GUI로 접속하기 file 2018.05.27 3650
263 linux에서 특정 포트를 사용하는 프로세스 확인하기 2017.04.26 3650
262 halyard 1.3의 console을 이용하여 100억건의 데이타에 대한 쿼리수행시 ScannerTimeoutException 발생시 조치사항 2017.09.06 3649
261 쿠버네티스(k8s) 설치 및 클러스터 구성하기 2019.10.19 3645
260 anaconda3 (v5.2) 설치및 머신러닝 관련 라이브러리 설치 절차 2018.07.27 3641
259 jena/fuseki 3.4.0 설치 2017.07.25 3635
258 [번역] solr 검색 엔진 튜토리얼 2014.10.07 3635
257 federated query 예제 2017.01.19 3631
256 hive기동시 Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D 오류 발생시 조치사항 2016.09.25 3631
255 crypto관련 기생충 박멸 스크립트 2018.05.11 3627
254 producer / consumer구현시 설정 옵션 설명 2016.10.19 3624
253 프로그래밍 언어별 딥러닝 라이브러리 정리 file 2016.10.05 3616
252 jena jar파일실행시 org.apache.jena.tdb.TDB.init에서 java.lang.NullPointerException발생시 조치사항 2016.08.19 3616
251 Embedded PostgreSql설정을 외부의 MariaDB로변경하기 [1] 2018.05.22 3612
위로