Skip to content
Home » 오픈 소스 룰 엔진 | Thingsboard Ce 교육 : 레슨 5. 규칙 엔진 15 개의 자세한 답변

오픈 소스 룰 엔진 | Thingsboard Ce 교육 : 레슨 5. 규칙 엔진 15 개의 자세한 답변

당신은 주제를 찾고 있습니까 “오픈 소스 룰 엔진 – ThingsBoard CE 교육 : 레슨 5. 규칙 엔진“? 다음 카테고리의 웹사이트 https://kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 ThingsBoard 이(가) 작성한 기사에는 조회수 19,715회 및 좋아요 90개 개의 좋아요가 있습니다.

Table of Contents

오픈 소스 룰 엔진 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 ThingsBoard CE 교육 : 레슨 5. 규칙 엔진 – 오픈 소스 룰 엔진 주제에 대한 세부정보를 참조하세요

Welcome on ThingsBoard online education course. This is the best way to become a ThingsBoard guru. Subscribe this channel and step forward to best practices with the Platform.
Lesson 5 is dedicated to heart and brain of ThingsBoard — the Rule engine. Learn all about processing logic in CE, find out how create own rules and apply them, discover the core principles of working with system messages to make IoT solution development fast and cosy.
Do not hesitate leave your comments or appreciate us with Likes and Shares.
Appendixes:
This cURL command allows you publishing telemetry on behalf of device —
curl -v -X POST -d \”{\\\”temperature\\\”: 25}\” $HOST_NAME/api/v1/$ACCESS_TOKEN/telemetry –header \”Content-Type:application/json\”
Create alarm function —
var details = {};
if (metadata.prevAlarmDetails) {
details = JSON.parse(metadata.prevAlarmDetails);
}
details.temperature = msg.temperature;
return details;
Convert Fahrenheit to Celsius degrees function —
function precisionRound(number, precision) {
var factor = Math.pow(10, precision);
return Math.round(number * factor) / factor;
}
if (typeof msg.temperature !== ‘undefined’){
msg.temperature = precisionRound((msg.temperature -32) * 5 / 9, 2);
}
return {msg: msg, metadata: metadata, msgType: msgType};
Transform incoming telemetry use case is available from — https://thingsboard.io/docs/user-guide/rule-engine-2-0/tutorials/transform-incoming-telemetry/
Note:
ThingsBoard CE education is a play-list with short and easy-to-perceive e-lessons. It’s designed to reduce your time on discovering all possibilities of our open-source platform. Deploy ThingsBoard from https://thingsboard.io and go through this play-list.
For more tutorials or particular how to’s follow the mainstream — https://www.youtube.com/thingsboard

오픈 소스 룰 엔진 주제에 대한 자세한 내용은 여기를 참조하세요.

Top 17 오픈 소스 룰 엔진 All Answers

Drools 6.0 – 룰 엔진으로 선언적 프로그램밍 맛보기 – Opennaru, Inc. OpenRules; Rule Engine; Drools – Drools – Business Rules Management System ( …

+ 여기에 자세히 보기

Source: toplist.halongpearl.vn

Date Published: 11/10/2021

View: 3868

Top 5 오픈 소스 룰 엔진 Trust The Answer

또한 Java를 기반으로 하는 Rule Engine이다. 이러한 자바 기반의 오픈소스 룰 엔진에는 Drools, Mandarax, JLisa 등이 있다. Drools는 다음과 같은 Project로 이뤄져 있다 …

+ 여기에 표시

Source: chewathai27.com

Date Published: 1/21/2022

View: 1483

‘오픈소스 룰엔진 – Drools’ 태그의 글 목록 – Story Of ace-T

2. 참고 사이트 1. Drools 란? – The Business Logic integration Platform 이다.자바 기반의 오픈소스 룰 엔진에는 Drools, Mandarax, JLisa 등이 있으며, 그중 Drools에 …

+ 여기에 보기

Source: acet.pe.kr

Date Published: 2/5/2022

View: 4127

Drools – Drools – Business Rules Management System (Java …

Drools is open source software, released under the Apache License 2.0. It is written in 100% pure Java™, runs on any JVM and is available in the Maven …

+ 여기에 자세히 보기

Source: drools.org

Date Published: 8/23/2022

View: 353

Drools 6.0 – 룰 엔진으로 선언적 프로그램밍 맛보기 – 오픈나루

Drools 6.0 룰 엔진에서 선언적 프로그래밍 형태의 간단한 룰 애플리케이션을 작성해 봅니다. 선언적 프로그래밍은 ‘어떻게 해야 하는가'(How to do it) 아닌 무엇을 …

+ 여기에 보기

Source: www.opennaru.com

Date Published: 2/3/2021

View: 910

rule-engine · GitHub Topics

Drools is a rule engine, DMN engine and complex event processing (CEP) … Rule engine implementation in Golang … Open Source Data Management Software.

+ 자세한 내용은 여기를 클릭하십시오

Source: github.com

Date Published: 9/11/2022

View: 6124

Rule Engine – 인호의 IT 잡동사니

Rule Engine은 아래와 같은 종류의 Open Source가 있다. Drools; OpenL Tablets; Easy Rules; Rule Book; Custom Rule Engine (직접 개발) …

+ 여기를 클릭

Source: helloino.tistory.com

Date Published: 10/17/2021

View: 4379

Thingsboard Ce 교육 : 레슨 5. 규칙 엔진 | 오픈 소스 룰 엔진 79 …

Rule Engine – 인호의 IT 잡동사니 – 티스토리. Rule Engine은 아래와 같은 종류의 Open Source가 있다. Drools; OpenL Tablets; Easy Rules; Rule Book; …

+ 여기에 자세히 보기

Source: ko.taphoamini.com

Date Published: 3/11/2022

View: 7429

혹시 JBoss의 Drools 쓰시는분 계신가요^^?

최근에 오픈소스 룰엔진을 찾다가 동료로부터 Drools라는 것을 들었습니다. 룰엔진이라는게 처음엔 일종의 메모리 DB정도라 생각했는데, 이전 프로젝트에서 룰엔진을 …

+ 여기에 표시

Source: groups.google.com

Date Published: 10/28/2022

View: 6471

Open Source Rule Engines in Java

Open Source Rule Engines in Java · Drools · Mandarax · JLisa · JEOPS – The Java Embedded Object Production System · Prova language · OpenRules · Open Lexicon …

+ 더 읽기

Source: java-source.net

Date Published: 5/28/2022

View: 9372

주제와 관련된 이미지 오픈 소스 룰 엔진

주제와 관련된 더 많은 사진을 참조하십시오 ThingsBoard CE 교육 : 레슨 5. 규칙 엔진. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

ThingsBoard CE 교육 : 레슨 5. 규칙 엔진
ThingsBoard CE 교육 : 레슨 5. 규칙 엔진

주제에 대한 기사 평가 오픈 소스 룰 엔진

  • Author: ThingsBoard
  • Views: 조회수 19,715회
  • Likes: 좋아요 90개
  • Date Published: 2019. 5. 14.
  • Video Url link: https://www.youtube.com/watch?v=RudSjzB-los

Top 17 오픈 소스 룰 엔진 All Answers

ThingsBoard CE 교육 : 레슨 5. 규칙 엔진

ThingsBoard CE 교육 : 레슨 5. 규칙 엔진

Drools 6.0 – 룰 엔진으로 선언적 프로그램밍 맛보기 – Opennaru, Inc.

Article author: www.opennaru.com

Reviews from users: 4243 Ratings

Ratings Top rated: 4.1

Lowest rated: 1

Summary of article content: Articles about Drools 6.0 – 룰 엔진으로 선언적 프로그램밍 맛보기 – Opennaru, Inc. Drools 6.0 룰 엔진에서 선언적 프로그래밍 형태의 간단한 룰 애플리케이션을 작성해 봅니다. 선언적 프로그래밍은 ‘어떻게 해야 하는가'(How to do it) 아닌 무엇을 … …

Most searched keywords: Whether you are looking for Drools 6.0 – 룰 엔진으로 선언적 프로그램밍 맛보기 – Opennaru, Inc. Drools 6.0 룰 엔진에서 선언적 프로그래밍 형태의 간단한 룰 애플리케이션을 작성해 봅니다. 선언적 프로그래밍은 ‘어떻게 해야 하는가'(How to do it) 아닌 무엇을 … Drools 6.0 룰 엔진에서 선언적 프로그래밍 형태의 간단한 룰 애플리케이션을 작성해 봅니다. 선언적 프로그래밍은 ‘어떻게 해야 하는가’(How to do it) 아닌 무엇을 해야 하는가 ’What to do’에 집중하여 프로그래밍하는 방법입니다. 예를 들자면 “최댓값 구하기”를 절차적 프로그래밍 언어로 구현한다면 루프를 이용하여 값의 집합에서 각 값을 반복적으로 비교하고 최종적으로 최댓값을 구하는 코드로 작성할 것입니다. 만약 이 문제를 룰 시스템을 이용하여 해결한다면 최댓값은 값의 집합 중에 가장 큰 값이 될 것입니다. 즉 “값의 집합에서 그 값보다 큰 값이 존재하지 않는 값” 이라고 할 수 있습니다.

Table of Contents:

Drools 6.0 – 룰 엔진으로 선언적 프로그램밍 맛보기 – Opennaru, Inc.

Read More

OpenRules

Article author: openrules.com

Reviews from users: 566 Ratings

Ratings Top rated: 4.9

Lowest rated: 1

Summary of article content: Articles about OpenRules Business rules and decision management system open source. … superfast execution of large rulesets! Can be used as a SaaS Rule Engine in AWS Marketplace. …

Most searched keywords: Whether you are looking for OpenRules Business rules and decision management system open source. … superfast execution of large rulesets! Can be used as a SaaS Rule Engine in AWS Marketplace. rule engine, business rules, decision modeling, decision services, DMN, SaaSBusiness rules and decision management system open source

Table of Contents:

OpenRules Decision Manager

Automating Business Logic

Goal-Oriented Approach

ML-based Rules Discovery

Decision Optimization

Rules-based Questionnaires

Accessing Databases

Business & IT Work in Concert

Logic Defined by Business

OpenRules Navigation Menu

Contact us

OpenRules

Read More

Rule Engine

Article author: helloino.tistory.com

Reviews from users: 4473 Ratings

Ratings Top rated: 4.0

Lowest rated: 1

Summary of article content: Articles about Rule Engine Rule Engine 종류. Rule 엔진을 직접 구현을 해서 사용할수도 있지만 Open Source를 이용하여 구현을 할수도 있다. Rule Engine은 아래와 같은 종류의 … …

Most searched keywords: Whether you are looking for Rule Engine Rule Engine 종류. Rule 엔진을 직접 구현을 해서 사용할수도 있지만 Open Source를 이용하여 구현을 할수도 있다. Rule Engine은 아래와 같은 종류의 … Rule Engine 언제 rule engine을 사용해야 되는 것인가? 해결해야 할 문제가 전통적인 코드개발로는 반복적인 코드 반복이 나올때 비지니스 요구 사항을 구현하기가 쉽지만, 그것을 해결하기 위한 유연한 방법을..

Table of Contents:

Rule Engine

언제 rule engine을 사용해야 되는 것인가

용어

Rule Engine 종류

티스토리툴바

Rule Engine

Read More

Drools – Drools – Business Rules Management System (Java™, Open Source)

Article author: drools.org

Reviews from users: 7282 Ratings

Ratings Top rated: 3.4

Lowest rated: 1

Summary of article content: Articles about Drools – Drools – Business Rules Management System (Java™, Open Source) Drools is open source software, released under the Apache License 2.0. It is written in 100% pure Java™, runs on any JVM and is available in the Maven … …

Most searched keywords: Whether you are looking for Drools – Drools – Business Rules Management System (Java™, Open Source) Drools is open source software, released under the Apache License 2.0. It is written in 100% pure Java™, runs on any JVM and is available in the Maven … Drools introduces the Business Logic integration Platform which provides a unified and integrated platform for Rules, Workflow and Event Processing.rule engine, business rule, java, DMN, decision model notation, open source, forward chain, backward chain, inference, decision table, DSL, software, library, constraint programming

Table of Contents:

Drools – Drools – Business Rules Management System (Java™, Open Source)

Read More

drools 기본개념 :: 삽질의 추억

Article author: ryuuun.tistory.com

Reviews from users: 7840 Ratings

Ratings Top rated: 3.8

Lowest rated: 1

Summary of article content: Articles about drools 기본개념 :: 삽질의 추억 Drools : BRMS 엔진, 오픈소스. ** 배포 : www.jboss.org 통해 배포. ** Drools 의 기본 rule 파일은 DRL 파일이다. * DRL 파일에 대한 기본 작성법을 … …

Most searched keywords: Whether you are looking for drools 기본개념 :: 삽질의 추억 Drools : BRMS 엔진, 오픈소스. ** 배포 : www.jboss.org 통해 배포. ** Drools 의 기본 rule 파일은 DRL 파일이다. * DRL 파일에 대한 기본 작성법을 … [Drools]Drools 기본 rule 작성법 ** Drools : BRMS 엔진, 오픈소스 ** 배포 : www.jboss.org 통해 배포 ** Drools 의 기본 rule 파일은 DRL 파일이다. * DRL 파일에 대한 기본 작성법을 overview 해 보자. * ru..개발하다가 화나면 글 찌끄리러 옴.

진지하지 않은 블로그

진지하지 않은 블로그 Table of Contents:

1 Overview

2 주석문

3 패키지

38 XML 룰 언어

관련글 관련글 더보기

인기포스트

drools 기본개념 :: 삽질의 추억

Read More

rule-engine · GitHub Topics · GitHub

Article author: github.com

Reviews from users: 35184 Ratings

Ratings Top rated: 4.3

Lowest rated: 1

Summary of article content: Articles about rule-engine · GitHub Topics · GitHub Drools is a rule engine, DMN engine and complex event processing (CEP) … Rule engine implementation in Golang … Open Source Data Management Software. …

Most searched keywords: Whether you are looking for rule-engine · GitHub Topics · GitHub Drools is a rule engine, DMN engine and complex event processing (CEP) … Rule engine implementation in Golang … Open Source Data Management Software. GitHub is where people build software. More than 83 million people use GitHub to discover, fork, and contribute to over 200 million projects.

Table of Contents:

Here are

211 public repositories

matching this topic

Improve this page

Add this topic to your repo

Footer

rule-engine · GitHub Topics · GitHub

Read More

아름다운 세상을 위하여 : Drools 소개: Rule을 바라보는 새로운 관점

Article author: saintjohn.egloos.com

Reviews from users: 30703 Ratings

Ratings Top rated: 3.7

Lowest rated: 1

Summary of article content: Articles about 아름다운 세상을 위하여 : Drools 소개: Rule을 바라보는 새로운 관점 Jaroslaw의 첫 번째 기고문인 이 문서는 복잡한 Rule Engine의 비밀을 파헤 … Drools는 오픈 소스 Rule Engine중 하나이며, Apache 라이센스 하에서 … …

Most searched keywords: Whether you are looking for 아름다운 세상을 위하여 : Drools 소개: Rule을 바라보는 새로운 관점 Jaroslaw의 첫 번째 기고문인 이 문서는 복잡한 Rule Engine의 비밀을 파헤 … Drools는 오픈 소스 Rule Engine중 하나이며, Apache 라이센스 하에서 … 아름다운 세상을 위하여

Table of Contents:

Drools 소개 Rule을 바라보는 새로운 관점 Java – 자바

이 글의 목적

개요

Rule Engine

Drools

Drools Rule Engine의 장점

BRMS

Pruduction Rule vs events

Rule Engine 사용예제

내부적으로 어떤 작업들이 수행되었습니까

요약

본 내용은 Jaroslaw Kijanowski가 2008년 7월 10일 목요일 오후 5시 25분에 게시했으며 JBoss의 technical아래에 정리되어 있습니다 RSS 20피드를 통해 이에 대한 모든 댓글을 확인해 보실 수 있습니다 여러분의 사이트에서 댓글이나 트랙백을 남길 수 있습니다

아름다운 세상을 위하여 : Drools 소개: Rule을 바라보는 새로운 관점

Read More

See more articles in the same category here: Top 924 tips update new.

Top 10 오픈 소스 룰 엔진 The 51 Latest Answer

Generics를 사용하는 Java의 규칙 엔진 | 기술 입문서 Generics를 사용하는 Java의 규칙 엔진 | 기술 입문서 1 Overview 2 주석문 3 패키지 38 XML 룰 언어 관련글 관련글 더보기 인기포스트 Read More Read More Drools 소개 Rule을 바라보는 새로운 관점 Java – 자바 이 글의 목적 개요 Rule Engine Drools Drools Rule Engine의 장점 BRMS Pruduction Rule vs events Rule Engine 사용예제 내부적으로 어떤 작업들이 수행되었습니까 요약 본 내용은 Jaroslaw Kijanowski가 2008년 7월 10일 목요일 오후 5시 25분에 게시했으며 JBoss의 technical아래에 정리되어 있습니다 RSS 20피드를 통해 이에 대한 모든 댓글을 확인해 보실 수 있습니다 여러분의 사이트에서 댓글이나 트랙백을 남길 수 있습니다 Read More Read More Rule Engine 언제 rule engine을 사용해야 되는 것인가 용어 Rule Engine 종류 티스토리툴바 Read More Read More Read More Read More See more articles in the same category here: Top 207 tips update new. ** Drools : BRMS 엔진, 오픈소스 ** 배포 : www.jboss.org 통해 배포 ** Drools 의 기본 rule 파일은 DRL 파일이다. * DRL 파일에 대한 기본 작성법을 overview 해 보자. * rule 파일 기본 구조 rule “ ” * when * then * end * name 룰의 이름이 된다. * attribute 룰을 실행하는데 영향을 주는 속성값. 선언적인 방법을 사용한다. ** attribute의 종류 * no-loop 룰이 다른 실행결과에 따라 변경되어 재실행 되는 경우 무한 루프를 돌 가능성이 생긴다. 그런 경우에 대비하여 루프를 막아주는 속성(기본값:false) * ruleflow-group 룰의 실행 시 실행단위로 지정해 줄 수 있는 그룹명을 설정하는 것으로 보인다. 기본값은 없다. * lock-on-activate 정확히 뭘 하는 녀석인지 잘 모르겠다. * salience 룰의 우선순위 설정. 기본값은 0 이고, 양수/음수 값을 사용할 수 있다. * agenda-group ruleflow-group와 비슷한 개념으로 보인다. 실행단위 설정같은것으로 보임 * auto-focus 룰이 활성화 되었으나 agenda-group이 아직 focus를 못 받았을 때 잠재적으로 focus를 활성화 시켜주는 옵션이라나머라나. * activation-group 매뉴얼만 봐서는 모르겠다. 영어가 짧아서. * dialect java or mvel 사용언어를 지정하는 놈이다. * date-effective 설정한 날짜에만 룰이 동작한다. * date-expires 설정한 날짜까지만 룰이 동작한다. * duration 룰이 동작하는 기간을 설정해준다. 타입은 long (deprecated 되었다고 함) ==> 대신 timer 속성을 쓴다. 다음과 같은 형식을 따른다.(cron 형식도 된다. 대박) timer ( int: ? ) timer ( int: 30s ) timer ( int: 30s 5m ) timer ( cron: ) timer ( cron:* 0/15 * * * ? ) 출처: https://java808.tistory.com/entry/Drools-기본-rule-작성법 [잡동사니 기술연구소^.^] 이글은 Drools 메뉴얼을 참고해 작성되었습니다. 1. Overview Drools 3부터는 XML 기반의 텍스트 포맷이 아닌 “native” 룰 언어를 제공한다. 이 포맷은 매우 가볍고 자연스러운 도메인 기반의 언어로의 확장을 지원한다. 여기서는 이 내장 룰 언어의 주요 개념을 살펴본다. 다이어그램은 “rail road”로 알려진 다이어그램을 사용했으며, 기본적으로 언어 단위의 설명을 위해서는 플로우챠트를 사용한다. 기술적인 사항을 위해서는 룰 언어를 위한 Antlr3 의 문법파일인 “drl.g” 파일을 참조해도 좋다. 만약 룰 관련 IDE를 사용한다면, 많은 수의 룰 구조가 이미 사용자를 위해 제공된다. (contents assistance) 예를 들면 “ru” 라고 입력후 ctrl_space를 누르면, 기본 룰 구조가 생성될 것이다. 1-1. Rule file 룰 파일은 .drl 확장자를 가진 일반적인 파일이다. 하나의 drl 파일은 여러개의 룰 또는 함수들이 존재할 수 있다. 어쨋건 사용자는 많은 룰파일을 통해 룰들을 스프레드하게 펼쳐서 사용할 수 있다. (이 경우, 확장자는 .rule 이 권고되지만 필요한건 아니다) 여러개의 파일로 존재하는 룰들은 많은 수의 룰들을 관리하는데 도움이 될 수 있다. DRL 파일은 단순한 텍스트 파일이다. 1-2. 룰은 무엇을 만드는가? 룰은 아래의 러프한 구조를 가진다. rule “name” ATTRIBUTES 이글은 Drools 메뉴얼을 참고해 작성되었습니다. when LHS then RHS end 정말 간단하다. 구두점(마침표)도 필요하지 않다. 심지어 룰 이름을 위한 ” 역시 옵션이며 new line 역시 옵션이다. ATTRIBUTES 역시 간단하며 항상 옵션이다. LHS 는 룰의 조건파트이다. RHS는 자바 문법코드로 실행될수 있는 코드블럭이며 (곧 다른 언어 문법도 제공될 예정이다. groovy 나 C# 같은) 단지 특별한 키워드는 FACT를 asserting, retracting, modifying 하는 부분이다. LHS에서 정의된(바인드된) 어떤 변수도 RHS 영역에서 사용할 수 있다. 주의할 점은 drl 자체에서 공백은 중요하지 않지만, Domain Specific Language에서는 예외이다. 1-3. Domain Specific Language DSL은 기본 내장 룰언어 기반의 확장처럼 구현된다. 이것은 ‘expander” 메카니즘을 사용하며, 이것은 확장가능한 API를 의미한다. 도메인 영역 또는 자연어 기반의 언어와 사용할 도메인 모델과의 매핑을 가진 .dsl 확장자가 사용된다. DSLs/expanders 는 컴파일 타임에 룰 소스안에서 처리된다. 만약 DSL이 만들고자 하는 어플리케이션에 이익이 된다고 믿는다면 시간이 지나면 여러 도메인을 위해 사용할 수 있는 많은 부가적인 DSLs 이 가용하거나 미리 만들어져 있을 거라는 사실이 도움이 될 것이다. 주로 룰작성을 보기 좋게 도와주지만, 어떤 사람들을 위해서는 기본 내장 룰 언어가 좋을수 있다. Freedom is good ! 1-4. 예약어 룰엔진에는 룰언어에서 사용하는 약간의 미리 예약된 키워드들이 있다. 룰 작성시나, 도메인 객체, 메서드, 속성등을 정의할때 충돌이 나지 않도록 피하는게 현명할 것이다. 미리 예약된 키워드들의 목록은 아래와 같다. when, then, rule, end, contains, metches, and, or, modify, retract, assert, salience, function, query, exists, eval, agenda-group, no-loop, duration, ->, not, auto-focus 2. 주석문 주석문의 경우 룰엔진에 의해 무시되는 문자열의 섹션이다. 룰엔진이 주석문을 만났을때 주석은 효과적으로 제거된다. 2-1. 단일 라인 주석 2-2. 복수 라인 주석 3. 패키지 패키지는 룰과 그리고 다른 관계있는 예를 들면 imports, globals 와 같은 구성물의 집합이다. 패키지의 요소들은 전통적으로 각각 다른것들과 관계가 있다. 패키지는 이름공간을 표현하고 룰의 그룹핑을 유일하게 유지할 수 있는 좋은 아이디어이다. 패키지의 이름은 그것자체로 이름공간을 의미한다. 어쨋건 그것은 파일이나 폴더와 연관이 있는것은 아니다. 일반적인 구조에서 패키지를 위한 모든룰들은 패키지 선언이 되어있는 파일에 모두 있을 것이다. 패키지 이름은 일반적인 자바 컨벤션을 사용해 선언되고 이름공간을 가지며, 스페이스를 허용하는 룰 이름과 다르게 패키지 이름은 이름 중간에 스페이스를 허용하지 않는다. “package” 나 “expander” 와 같은 구문은 어떤 룰 정의가 나타나기 전인 파일의 맨 위에 존재한다. 모든 경우에 세미콜론은 옵션이다. 3-1. import import 구문은 자바에서의 import 구문과 같다. 룰에서 사용하기를 원하는 어떤 오브젝트를 위해서 전체 경로와 타입이름을 명시하는게 필요하다. Drools의 경우 같은 이름으로 되어 있는 자바패키지로부터 자동으로 클래스를 import 한다. 3-2. expander expander 구문은 옵션이며, DSL 설정(보통은 별도의 파일로 저장되어 있는)을 명시하기 위해 사용된다. 이것은 해석기가 룰안에서 작성된 룰을 이해하는실마리로 제공된다. 3-3. global Globals 은 전역변수들이다. 만약 복수의 패키지에서 같은 indentifier 의 전역변수를 선언하고 싶다면, 그것은 반드시 같은 타입이어야 하고, 모든 참조는 같은 전역값을 가르킬 것이다. 이것은 전통적으로 리턴값을 위해 사용된다. 예를 들면, 엑션의 로그나, 룰에서 사용될 서비스나 데이타를 제공하기 위해서 사용된다. Globals 는 워킹메모리로 추가되지 않으며, 룰엔진은 Globals가 변경되는지 걱정하지 않는다. 이런 이유때문에 Globals는 마지막으로 사용된 값이 없어 제약조건으로 사용되지 않는다. 제약사항으로서 globals의 올바르지 않은 사용은 놀랄만한 결과를 야기시킬 것이다. 나쁜쪽으로 놀라게 될것인데, 아마도 의사가 당신의 XRay를 보고서 “매우 흥미롭군요” 라로 말하는 느낌일 것이다. 이것은 원한다면 어떤 오브젝트라도 당신이 룰에서 넘겨받아 사용할 수 있다는 것을 의미한다. 서비스 위치지정자, 또는 서비스 자체를 넘겨줄 수 잇다. 예를 들면 이메일 서비스의 인스턴스를 넘겨줄 수도 있다. DRL안에서 당신은 이메일 서비스 타입의 global을 가질수 있고 그것에 이름을 “email” 이라고 지정해 줄 수 있을 것이다. 그런 다음 룰의 엑션부분에서 당신은 email.sendSMS(number, message) 와 같이 사용할 수 있을 것이다. 3-4. Fnuction 함수는 룰소스 안에서 일반적인 자바 클래스 안에서 적당하지 않은, 의미있는 코드를 넣는 방법의 하나이다. 물론 핼퍼 클래스를 작성하면 함수는 별 소용이 없을 것이다. (사실은 룰엔진에서 컴파일시에 핼퍼 클래스로 만들어진다) 룰에서 함수를 사용하는 가장 주요 이점은, 한 장소에 모든 로직을 모아서 유지할 수 있다는 것이다. 그리고 당신은 필요에 따라 함수를 수정해서 전체 룰안에서 변경내용을 반영시킬 수 있다. 함수는 룰의 “then” 파트, 즉 실행영역에서 엑션을 실행시키기 위해 대부분 사용된다. 전통적인 함수의 선언은 다음과 같을 것이다 : function String calcSomething(String arg) { return “hola !”; } function에 인자가 필요없을 경우 인자를 넘겨줄 수 없다. 룰안에서 함수를 호출하기 위해서는 (아마도 consequence 또는 eval 안에서) 간단히 함수의 이름을 적어주고 파라미터를 넘겨주면 된다. method 호출과 비슷하다 function 의 대안중 하나로는 핼퍼 클래스의 static 매서드가 될 수 있다. Foo.doSomething 과 같은, 또는 Global 로 선언된 핼퍼 클래스나 서비스의 인스턴스로 파라미터를 넘겨줄 수도 있다. 3-5. 룰 (Rule) 룰 구조는 명백하게 가장 중요한 구조이다. 룰은 “IF” 어떤것과 “THEN” 엑션의 폼이다. (물론 우리가 알다시피 키워드는 “when” 과 “then” 이다) 룰은 반드시 이름을 가져야 하며, 그리고 룰 패키지 안에서 이름은 유니크해야 한다. 만약 룰이름 사이에 공백이 들어간다면 룰 이름은 ” 로 감싸줘야 한다. 속성의 경우 옵션이다. 위에서 보는바와 같이 룰의 종료 키워드는 “end” 이며, 룰은 물론 중첩될 수 없다. 3-5-1. LHS LHS는 보통 룰의 조건파트라고 불려진다. 자세한 사항은 아래의 다이어그램을 참조하기 바란다. 패턴은 아래와 같이 설명된다. 3-5-2. RHS RHS는 룰안에서 일반적으로 엑션파트 또는 결과파트로 불려진다. RHS 파트의 목적은 워킹메모리에서 facts 를 추가하거나 수정하거나 삭제하는데 있다. 그리고 또한 어플리케이션을 위해 명시된 엑션을 호출하기도 한다. 실제적으로는 룰이 fire 될때 실행되는 코드블럭이다. 여기에 워킹메모리를 수정하기 위해서 사용가능한 몇가지의 편리한 매서드들이 있다. “modify(obj);” 은 룰엔진에 객체가 수정되었음을 알려주고 룰들은 변경된 객체를 기반으로 다시 판단될 것이다. “assert(new Something());” 은 워킹메모리 안으로 새로운 객체가 생성되었다는 것을 알려준다. “assertLogical(new Something());” 은 assert 와 비슷하다. 그러나 현재 firing 된 룰의 참값을 위해서 더 이상의 facts가 없을때, 자동으로 삭제될 것이다. “retract(obj);” 은 워킹메모리 안에서 객체를 제거한다. 이 편리한 매서드들은 기본적으로 KnowledgeHelper 객체의 바로가기를 제공하기 위한 매크로이다. 더 자세한 작동을 알고 싶다면 KnowledgeHelper 클래스를 참조. KnowledgeHelper 인터페이스는 기본적으로 RHS 코드 블럭을 drools 로 불려지는 변수처럼 유용하게 만들어준다. 만약 “Property Change Listeners” 를 자바빈에서 제공한다면, 룰엔진에 해당 객체가 추가된 후에 객체가 변경이 되었을때 “modify” 를 호출해야 하는것을 피할 수 있다. 3-5-3. Rule Attribute default value : false type : Boolean default value : 0 type : integer default value : MAIN type : String default value : N/A type : String default value : N/A type : String default value : no default value type : long 약간의 속성을 사용한 룰의 사용예를 작성해 보면 다음과 같다. rule “my rule” salience 42 agenda-group “number 1” when … 3.5.4 Column 코드 예시: Cheese() Cheese( type == “stilton”, price < 10) 룰은 하나 이상의 오브젝트 타입에 따라 필드의 제약조건으로 구성된다. 내부적으로 매치된 각각의 오브젝트 타입의 인스턴스는 배열로 저장된다. 만약 Person, Person, Pet 세개의 오브젝트에 대해 매치를 수행하게 되면, 배열에 세개의 요소가 존재하게 된다. Drools안에서 Tuple 처럼 이 Facts의 리스트를 참조한다. 배열안에 각각의 요소들은 컬럼이다. 각각의 오브젝트 타입의 인스턴스는 0 이상의 필드 제약조건을 통해 필터링된다. 컬럼항목은 오브젝트 타입상에서 제약조건의 리스트를 위해 참조된다. 위의 코드 예시에서 첫번째 줄과 같이 어떤 제약조건도 없다면 워킹메모리의 어떤 치즈도 매치가 될것이다. 두번째 줄의 경우는 치즈 오브젝트의 인스턴스에 대해서 두개의 문자필드 제약사항을 참조한다. 제약조건들은 콤마에 의해 구분되고, 묵시적으로 "and" 를 의미한다. 상기 다이어그램에 표기된 컬럼의 바인딩은 아래와 같이 코드로 표현된다. cheapStilton : Cheese( type == "stilton", price < 10 ) 필드 바인딩은 이전 경우와 비슷하지만, 치즈의 인스턴스에 변수를 바인딩하는 케이스이다. 이것은 cheapStilton 객체를 다른 조건에 사용할 수 있는것을 의미하거나, 아마도 룰의 실행부분에서 사용할 수도 있다. 당신은 또한 그것을 먹을수도 있겠지만, 나는 그러지 않았다. 3-5-4-1. Field Constraints 필드 제약사항은 룰엔진을 위해 워킹메모리로부터 매치되는 Fact 오브젝트들을 제약한다. 이것은 Fact 오브젝트 인스턴스로부터 "field" 값을 측정하고 비교한다. 여기서 필드는 클래스의 public, private 멤버 변수로서의 필드가 아니다. 필드는 접근가능한 매서드이다. 만약 오브젝트가 자바빈 패턴을 따른다면, 필드는 노출된 "getXXX" 또는 'isXXX" 메서드이다. 이것은 매서드가 인자가 없다는 것이고 무엇인가를 리턴한다는 의미이다. 당신은 빈이름 컨벤션을 사용해서 필드에 접근할 수 있다. (예를 들면 "getType" 은 "type" 으로 접근가능하다) 예를 들면, 우리의 치즈 클래스를 참조할 때, Cheese(type == ...) 라는 것은, 치즈 인스턴스상의 getType() 메서드를 사용한다. 물론 getter 매서드가 아닌것들도 접근가능하다. toString() 같은. 이럴 경우 Cheese(toString == ..) 와 같이 매서드의 전체 이름을 통해 접근하며 괄호는 필요없다. 매서드들을 인자없이 접근한다는 것을 명심하라. 그것이 접근자(accessors) 다. 이 접근자는 룰의 효율성의 도모하기 위한 방법으로 오브젝트의 상태를 변경하지 않는다. 룰엔진은 더 빠른 결과를 위해 invoke되어 매치된 결과를 효율적으로 캐쉬한다는걸 기억하라. 만약 필드를 위해 primitive 타입을 사용했다면 Drools는 그것들을 그것에 상응하는 오브젝트로 autobox 할것이다(심지어 자바 1.4 버전을 사용하더라도). 어쨋든 현재 자바 1.4에서 그것들은 더이상 auto-unboxing 되지 않는다. 전체적으로 룰안에서 사용될 모델 오브젝트 상에서 primitive 타입을 사용하지 않는 것이 아마도 최선일 것이다. 만약에 당신이 Java 5 를 사용한다면 양쪽 측면에서 모두 최선이다. (컴파일러에게 autobox 를 지정할 수 있다) 만약 당신이 Java 5 를 사용하고 당신이 JDT semantic 컴파일러를 사용한다면 (JANINO 는 아직 Java 5를 지원하지 않는다) Drools 는 당신을 명예롭게 여길것이다. 3-5-4-1-1. JavaBeans as facts JavaBeans 노트 : 자바빈즈 컨벤션은 아래와 같다. 그러나 아래에 보여지는 것처럼 메서드 이름을 사용해서 getter 매서드들을 접근할 수 있다. 문법은 대소문자를 구분한다. 대문자를 사용한 "getURL" 같은 getter 매서드들의 경우, 속성의 이름은 "URL" 이다. "get" 이후에 하나 이상의 대문자가 있을 경우, 이렇게 하는것이 정확하게 자바빈즈 표준이다. (사실은, Instrospector 유틸이 사용된다) 3.5.4.1.2 Operator (연산자) 다양한 필드 제약사항과 함께 사용할 수 있는 여러개의 연산자가 있다. 올바른 연산자는 필드의 타입에 의존한다. 일반적으로 데이타의 타입에 기반해 연산자는 자체적으로 해석될 수 있다. 예를 들면, 날자 필드에 대해 ", =. <= Cheese( quantity == 5) [Date] 현재는 단지 "dd-mmm-yyyy" 데이타 포맷만 기본으로 지원한다. 시스템 프로퍼티("drools.dateformat) 처럼 기본 데이타 포맷 마스크를 사용해서 커스터마이징 할 수 있다. 만약 추가적인 포맷이 요구된다면, 미리 정의해서 사용하기 바라며, 올바른 연산자는 아래와 같다. ==, !=, >, =. <= Cheese( bestBefore < "27-Oct-2007" ) [String] 어떤 유효한 자바 스트링도 가능하며, 올바른 연산자는 아래와 같다. ==, != Cheese(type == "stilton") [Boolean] 단지 true, 또는 false만 사용이 가능하다. 0 또는 1은 인식되지 않으며 Cheese( smelly )와 같은 표현도 인식되지 않는다. 가능한 연산자는 아래와 같다. true, false Cheese( smelly == true) [Matchs Operator] 어떤 자바 정규표현식이 스트링 필드에 대해 매치로 사용가능하다. Cheese( type matches "(Buffulo)?\\S*Mozerella" ) [Contains, Exclude Operator] 이것은 특별한 연산자이며, 필드의 컬렉션이 오브젝트를 포함하는지, 포함하지 않는지 체크하는데 사용된다. CheeseCounter( cheeses contains "stilton" ) CheeseCounter( cheeses excludes "chedder" ) [Bound Variable Constraints] 변수들은 Fact들, 또는 그것들의 필드들에 대해 바운드 될수 있다. 그리고 이것들은 다른 필드의 제약사항으로 사용될 수 있다. 바운드된 변수들은 Declaration 이라고 불린다. Declarations 는 "matches" 와 같이 사용될 수 없다. "contains" 연산자와 같이 동작한다. 강요된 필드의 타입에 따라 올바른 연산자가 결정된다. 바운드 변수들은 연산자가 매우 빠른 실행과 향상된 성능을 위해 특별한 "==", "=!" 가 제공된다. Person( likes : favoriteCheese ) Cheese( type == likes ) likes는 바인딩된 변수, 즉 Declaration 이다. 이것은 어떤 Person 인스턴스에 매칭되는데 사용되기 위해 favorateCheese 필드에 바인딩 되어있다. 자바에서 사용가능한 어떤 유효한 변수명이라도 사용할 수 있으며, 다른곳에서도 필드이름과 차별할 수 있도록 종종 사용되는 '$' 문자를 사용할 수 있다. 아래의 예제 코드에서는 '$'를 사용하고 있고 컬럼 오브젝트 타입의 인스턴스에 바인딩이 되는 것을 보여주고 있다. 그리고 바인딩된 Fact 는 'contains' 연산자를 사용할 수 있다. $stilton : Cheese( type == "stilton" ) Cheesery( cheeses contains $stilton ) 3.5.4.1.5 단정적인 (Predicate) 제약사항들 단정적인 제약사항은 어떤 유효한(primitive boolean 으로 평가될 수 있는) 자바 표현식이건 사용할 수 있다. Declaration identifiers 처럼 Drools 의 키워드의 사용은 피해야 한다. 이전에 바운드 선언은 표현안에서 사용되었다. 단정적인 제약사항안에서 사용되는 함수는 반드시 리턴 시간이 일정한 결과로 나와야 한다. 아래의 예제는 "Return Value 연산자"를 사용해 남성보다 2살많은 남성/여성의 모든 쌍을 찾는다. Person( girlAge : age, sex = "F" ) Person( boyAge : age -> (girlAge.intValue() == boyAge.intValue() + 2), sex = “M” ) 3.5.4.1.6 Return Value 제약사항 리턴밸류 제약사항은 오브젝트를 리턴하는 어떤 유효한 자바의 표현식이라도 사용할 수 있다. 그것은 primitives 를 리턴할 수 없다. Drools의 키워드 사용을 피하고 함수같은 경우 리턴 결과시간이 일정한 함수가 사용된다. 선언적인 제약사항 예제와 같이 모든 남성/여성 쌍을 찾는 아래의 예제는 여성보다 2살많은 남성의 쌍을 찾는다. 여기서는 boyAge 에 바인드를 사용하지 않는것을 주의해서 보기 바란다. 읽기에 좀 더 쉽게 만들었다. Person( girlAge : age, sex == “F” ) Person( age == (new Integer(girlAge.intValue() + 2) ), sex == ‘M’) 3.5.5 조건항 (Conditional Element) 조건항은 하나이상의 컬럼과 작업한다. 가장 일반적인 하나는 여러개의 컬럼을 가지는 LHS안에서 묵시적으로 사용되는 “and” 이다. ‘and’를 만족했을때 그것이 하나이상의 fact와 매치되어도 선언은 단지 하나의 Fact만 참조가능하다. 어떤 fact가 바인드를 위해 참조되는가? 3.5.5.1. ‘ and’ 유효한 하위 조건 : and, or, not, exists, column Cheese( cheeseType : type) && Person( favouriteCheese == cheeseType) Cheese( cheeseType : type) and Person( favoriteCheese == cheeseType) 3.5.5.2. ‘or’ 유효한 하위 조건 : and, or, not, exists, column Person( sex == “f”, age > 60) || Person( sex == “m”, age > 65 ) Person( sex == “f”, age > 60) or Person( sex == “m”, age > 65) 바인딩과 같이 사용되는 or pensioner : ( Person( sex == “f”, age > 60 ) or Person( sex == “m”, age > 65 ) ) ‘or’ 조건항 은 sub rule 이라고 불리는 여러개의 룰을 생성하는 결과를 낳는다. 위의 예제는 내부적으로 두개의 룰을 생성한다. 이 두개의 룰은 워킹메모리 안에서 독립적으로 작동한다. 이것의 의미는 각각이 매치되어 활성화되고, fire되는 것을 의미한다. 이것에 대해 지름길은 없다. 가장 좋은 방법은 OR 조건항의 경우 두개의 룰을 생성하는 간단한 방법이라고 생각하는 것이다. 3.5.5.3 ‘eval’ 유효한 하위 : none Eval 은 어떤 의미적인 코드(primitive boolean 을 리턴하는)가 실행되는 것은 허용하기 위해서는 필수적이다. 이것은 LHS에서 바이드된 변수를 참조할 수 있다. 그리고 룰 패키지안의 함수역시 사용가능하다. eval 은 또한 룰의 LHS의 마지막 조건항이 될수도 있고, 룰안에서 여러개의 eval 을 가질수도 있다. 일반적으로 어떤 컬럼 제약조건과 더불어 eval 을 조합해 사용할 것이다. eval 은 인덱스화 될 수 없기때문에 최적화된 필드 제약조건 같지는 않다. 어쨋건 필드의 제약조건에서 허용되지 않는 리턴값의 시간이 변하는 함수가 있을때 사용할 수 있는 좋은 아이디어다. 룰의 모든 다른 조건항들에 eval은 각각의 시간을 체크할 수 있다. Drools 2.x 대 버전과 유사한 형태로, 에전 Drools의 파라미터와 조건 태그는 접근가능한 타입으로 변수와 바인딩되는 것과 동일하다. 그리고 그것을 eval 노드안에서 사용한다. p1 : Parameter() p2 : Parameter() eval(p1.getList().containsKey(p2.getItem()) ) eval(isValid(p1, p2) ) //이것은 isValid 라고 이름된 함수가 있다는걸 가정한다. 3.5.5.4. ‘not’ 유효한 하위요소 : Column ‘not’은 로직의 존재상 기호의 첫번째 순서이며, 워킹메모리안에서 어떤것의 존재성 여부를 체크한다. 현재 단지 컬럼만이 ‘not’ 연산안에 포함될 수 있지만 다음 버전에서는 ‘and’ 그리고 ‘or’ 역시 허용될 것이다. not Bus() not Bus(color == “red”) not ( Bus(color == “red”, number == 42) ) //괄호는 옵션이다 3.5.5.5. ‘exists’ 유효한 하위 : Column ‘exists’는 로직의 존재상 기호의 첫번째 순서이며, 워킹메모리 안에서 어떤것의 존재성을 체크한다. “exists” 를 의미론적으로 생각해보면 “적어도 하나..”라고 생각할 수 있다. 그 자신의 컬럼을 단지 가질수 있는점에서 차별화 된다. 만약 컬럼과 같이 exist를 사용한다면, 룰은 워킹메모리 안에서 얼마나 많은 데이타가 있는지 가이드가 없이 단지 조건과 매치되는 룰이 활성화 될것이다. 현재 컬럼만 ‘exists’ 연산안에 포함될 수 있지만, 다음 버전에서는 ‘and’ 와 ‘or’ 역시 허용될 것이다. 적어도 하나의 버스를 표현하는 코드는 exists Bus() 적어도 하나의 빨간 버스를 표현하는 코드는 exists Bus(color == “red”) 3.5.5.6 ‘group’ 그룹핑은 대수학에서 괄호를 사용하는 것과 유사하다. 그것은 연산의 순서를 명시적으로 만드는데 사용된다. … ( Message( status == Message.HELLO ) and Message(message != null) or Message(status == null) ) … 마지막으로 룰 예제하나를 보면 아래와 같다 rule “Approve if not rejected” alience -100 genda-group “approval” when not Rejection() p : Police(approved == false, policyState : status) exists Driver(age > 25) Process(status == policyState) then log(“APPROVED: due to no objections.”); p.setApproved(true); end 자바5는 primitives와 적당한 타입 사이에 autoboxing 과 unboxing 을 지원한다. 이것은 코드를 읽기 매우 쉽고 편리하게 만든다. 어쨋건 Drools의 경우 J2SE 1.4 이상에서 구동된다. 그러므로 우리는 autobox 을 가지게 되었다. 참조된 필드는 자동으로 적절한 오브젝트 타입으로 autobox 된다. 이미 객체 타입이라면 아무런 변화도 발생하지 않는다. 어쩃건, unboxing 이 자동으로 되지 않는 사실은 중요하다. 그러므로 객체 모델에서 int 타입의 필드가 바인드 되었다면, 그것은 룰안에서 객체처럼 행동할 것이다. 일반적인 룰안에서 가능하다면 필드를 객체 타입을 사용해라. (적어도 자바5가 아니라면) 또한 적어도 필드를 오브젝트 타입처럼 생각해라. 다른 특별한 사항으로는 리턴값을 위한 제약사항이 있다. 리턴값의 코드조각은 반드시 primitive 가 아니고 객체를 리턴해야 한다. 자바안에서는 모든것이 오브젝트가 아니라는 사실은 이처럼 두통을 유발한다. 3.6 Query 쿼리는 단지 룰의 LHS 구조를 포함한다. ‘when’이나 ‘then’ 을 명시하지 않는다. 그것은 워킹메모리 안에서 조건상태와 매치되는 facts를 질의하기 위한 간단한 방법이다. 결과값을 받기 위해서는 WorkingMemory.getQueryResults(“name”) 구문을 사용하라. 여기서 “name”은 당연히 쿼리의 이름이다. 쿼리의 이름은 RuleBase에서 전역으로 사용할 수 있다. 그러므로 같은 RuleBase 를 위해 다른 패키지 상에서도 같은 이름의 쿼리를 추가하지 말아야 한다. 쿼리 결과의 리스트는 쿼리와 매치된 객체들을 얻을수 있도록 허용한다. 아래의 예제는 나이가 30 이상인 모든 사람들을 가져오는 간단한 쿼리이다. query “people over the age of 30” person : Person( age > 30 ) end ‘for’ 루프를 이용해서 리턴된 쿼리의 결과를 반복할 수 있다. 리턴된 쿼리결과에서 각각의 행은 Tuple 안에서 각 컬럼에 접근하는데 사용될 수 있다. 이 컬럼은 인덱스 위치나 바운드된 선언명에 의해 접근 가능하다. 아래의 예제를 참고하라 QueryResults results = workingMemory.getQueryResults(“people over the age of 30”); System.out.println(“we have ” + results.size() + “people over the age of 30”); System.out.println(“These people are over 30:”); for (Iterator it = results.iterator; it.hasNext();) { QueryResult result = (QueryResult) it.next(); Person person = (Person) result.get(“person”); System.out.println( person.getName()); } 3.7 Domain Specific Language 이전에 이미 얘기했듯이, DSL은 당신의 문제영역을 위해 룰언어를 확장될 수 있는 방법이다. 이것은 사용자를 위해 룰언어 안으로 연결되고 모든 모호한 룰언어와 룰엔진의 기능을 사용할수 있도록 돕는다. 3.7.1 언제 DSL을 사용하는가? 생략. 3.7.2 수정 그리고 DSL 관리하기 생략 생략 생략 There is a Person with name of “kitty” –> Person(name=”kitty”) Person is at least 42 years old and lives in “atlanta” —> Person(age > 42, location=”atlanta”) Log “boo” —> System.out.println(“boo”) There is a Person with name of “bob” and Person is at least 30 years old and lives in “atlanta” —> Person(name=”kitty”) and Person(age > 30, location=”atlanta”) 생략 3.7.3 룰안에서 DSL 사용하기 컴파일 시점에 DSL을 사용하고 룰을 실행하기 위해서는 DSL 설정소스와 룰소스를 같이 넘겨줘야 한다 PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( source, dsl); //Source is a reader for the rule source, dsl is a reader for the DSL configuration 또한 룰 소스파일에는 아래처럼 특정 expander 선언이 필요하다 expander your-expander.dsl 생략 조건에 제약조건을 추가할때는 아래와 같이 처리한다. 아름다운 세상을 위하여 : Drools 소개: Rule을 바라보는 새로운 관점 Drools 소개: Rule을 바라보는 새로운 관점 오랜 기간 함께 일해 온 기고가 중 한 명이 폴란드에서 활동하는 JBoss QA 엔지니어인 Jaroslaw를 소개하면서, 그가 매우 흥미로운 자료를 작성하고 있다고 전해왔습니다. Jaroslaw의 첫 번째 기고문인 이 문서는 복잡한 Rule Engine의 비밀을 파헤치고 있습니다. 여러분은 Drools, JBoss Rules, 또는 JBoss Drools으로 불리는 이 Rule Engine이 어떤 일을 하며, 그것을 여러분의 프로젝트에 어떻게 적용할 수 있을지에 대해 알고 싶어할 것입니다. (이 기고문은 논리적이면서도 흥미로운 내용을 포함하고 있기 때문에, 어려운 단어 퍼즐이나 난해한 수학 문제를 좋아하는 사람이라면 재미있게 읽을 수 있을 것입니다.). 여기서는 그의 기고문 전문을 트랙백과 함께 모두 제공하며, 원문은 Jaroslaw의 사이트에서 확인할 수 있습니다. 본아티클은 독어와 폴란드어로도 제공됩니다. 이 글의 목적: 개발자, 아키텍트 또는 비즈니스 분석가라면 최소한 본 기고문의 제 1장은 알아둘 필요가 있습니다. 여기에는 특정 어플리케이션의 가독성을 높이고 이들의 관리 및 유지 보수를 쉽게 만들어주는 Rule Engine에 대해 소개하고 있습니다. Rule Engine은 특정 이벤트나 메모리 내 일부 객체의 상태에 따라 의사 결정을 수행하는 어플리케이션에 적용됩니다. 개요: 이 기고문은 Rule Engine에 대한 소개, Eclipse IDE를 설치하는 법, 그리고 Drools Workbench 플러그인을 통한 Eclipse 구성 방법 등에 대하여 다룹니다. Rule Engine Rule Engine은 소프트웨어의 일부분이며, 최소한의 지식(Knowledge)만으로도, 결론을 추론(inferencing)해낼 수 있는 도구입니다. 지식 및 추론은 규칙(rule)로 저장되며, 이를 생성 규칙(production rule)이라 합니다. 다시 말해, 생성 규칙은 주어진 조건들이 true일때 실행되는 Action으로 구성됩니다. 이외에도 의사 결정을 수행하는 동안 사용하고자 하는 모든 객체를 저장하는 작업 메모리(working memory)도 있습니다. Action의 수행을 통해 기존 객체가 추가, 삭제 또는 변경될 수 있기 때문에, 메모리의 상태는 계속해서 변화하며, 이 과정에서 둘 이상의 규칙들이 서로 충돌하는 현상이 발생할 수 있습니다. 보통 1개 이상의 규칙들이 동시에 true가 될때 이러한 현상이 발생합니다. Agenda는 이러한 충돌 상황을 해결해줍니다. Agenda는 현채 선택되어 있는 Action의 실행 순서를 조정합니다. 특정 Action이 실행된 이후 메모리의 상태가 변경되면, 이전에는 true값을 가졌던 Rule들이 이제는 더이상 유효하지 않은 상태로 바뀌며, 그 결과 관련된 Action들이 취소되니다. Agenda는 Rule엔진에서 매우 중요한 부분입니다. 위의 전체 과정을 간단하게 요약하면 다음과 같은 그림으로 나타낼 수 있습니다. Rule Engine은 다음과 같은 용도에 가장 적합합니다. 제품 수량이나 가격에 따른 할인 금액 계산 운전자의 연령 및 자동차의 가격에 따른 보험 정책 결정 문제점 분석 장애 발생 의심 상황 탐지 매우 복잡한 문제 해결 Drools는 오픈 소스 Rule Engine중 하나이며, Apache 라이센스 하에서 배포된 Java 라이브러리입니다. 바이너리뿐 아니라 소스 코드까지 다운로드 받을 수 있으며, 해당 라이브러리를 사용하여 자유롭게 어플리케이션을 작성할 수 있습니다. Rule Engine의 핵심은 추론 엔진(inference engine)입니다. 추론 엔진의 역할은 Fact와 Rule을 패턴 매칭을 사용하여 분석한 뒤, condition이 true인 것으로 판명되는 Rule의 Action들을 수행하도록 합니다. 이러한 패턴 매칭 작업은 객체 지향 개념을 사용하여 확장된 RETE 알고리즘에 의해 수행됩니다 앞서 말한 바와 같이, Rule Engine내에서 지식(Knowlede)은 Production Rule의 형태로 표시됩니다. 데이터에 Rule Engine에 데이터를 제공하기 위한 방법으로는 ‘일차 술어 논리’(First Order Logic)가 사용됩니다. 일차 술어 논리 표현식을 사용하면 ‘2 + 3 == 5’ 또는 ‘customer.age > 17’ 같은 표현식의 true/false 여부를 평가할 수 있습니다. 생성 규칙은 Condition과 Action 두가지 주요 부분으로 나뉩니다. when Customer (age > 17) then System.out.println(“Customer is full age”); 위의 규칙들을 만족하는 모든 객체들은 true값을 반환할 것이며, 해당 객체들은 성년 고객으로 분류될 것입니다. SQL 쿼리를 사용하는 경우 위 Rule을 다음과 같이 나타낼 수 있을 것입니다. SELECT * from Customers c WHERE c.age > 17 Rule이 true인지 판단하고 그에 따른 Action을 수행 하는데에는 두가지 방식이 있습니다. 먼저 Fact 위주의 연산을 수행하는 Forward Chaining방식은 Fact위주의 연산을 수행하여 결론을 추론냅니다. 이것은 Condition 파트의 조건들을 사용하여 작업 메모리에서 true로 판명된 Fact들을 분류하고, 실행될 Action들의 목록을 분류하는 방법입니다. Condition을 만족시키는 Fact가 더이상 남아있지 않은 경우 패턴 매칭 프로세스가 종료됩니다. 반면에, Backward Chaining은 목적(Goal) 중심의 접근 방식입니다. 특정 목적에 해당하는 Action들을 수행하는 Rule에 대해서만 true/false 여부를 판단하고, 평가한 Rule들중 true인것이 존재하는 경우 해당 Action을 수행합니다. Drools Rule Engine의 장점 어플리케이션에서 작업 흐름을 제어하는 조건들을 별도 분리 가능 Rule 은 별도의 파일에 저장 서로 다른 사용자 그룹에 의한 Rule 변경이 가능 Rule 변경으로 인해 전체 어플리케이션을 다시 빌드할 필요가 없음 모든 Rule 들이 단일 저장소 (repository) 에 저장되므로 어플리케이션 작업 흐름을 손쉽게 제어 또는 관리 가능 복잡한 if-then 구문을 쉽고 읽기 편한 Rule 로 대체 가능 Rule 문법을 쉽게 배울수 있음 Eclipse IDE 플러그인을 통해 손쉽게 Rule 을 작성하고 RETE 트리를 확인 가능 복잡한 알고리즘 을 사용해서도 풀수 없는 문제들을 , Rule Engine 을 사용하여 해결하는 것이 가능하며 , 코드에 비해서 읽고 이해하기가 쉬움 Rule Engine 은 선언적 프로그래밍 (Declarative Programming) 패러다임을 사용하며 , ‘ 어떻게 문제를 풀어야 하는가 ’ (What) 에 초점을 맞추지 않고 , ‘ 무엇을 해결해야 하는가 ’ 에 초첨을 맞추어 문제를 해결 기존 절차적 프로그래밍 방식으로는 엄청나게 복잡하고 , 많은 시간이 소요되는 문제들을 손쉽게 해결할 수 있음 . 문제 해결에 사용된 전체 추론 과정을 살펴볼 수 있어 , 어떤 과정을 통해 최종 결과가 도출되었는지를 쉽게 이해할 수 있음 특정 문제의 해결 방식이 지나치게 복잡하거나, 알고리즘 내에 if-then, switch 구문이 많이 포함되어 있는 경우, Rule Engine의 사용을 고려할 필요가 있습니다. 어플리케이션의 로직이 자주 변경되거나, 실제 개발자가 아닌 일반 사용자들이 어플리케이션 내부 로직을 변경해야 하는 경우에도 마찬가지입니다. Drools는 Rule Engine에 추가하여, BRMS(Business Rules Management System) 라고 불리는 Rule 관리 어플리케이션도 제공합니다. 이 어플리케이션을 사용해서 Rule을 생성/수정/삭제 하거나 특정 저장소에 저장하거나 다양한 버전의 Rule로 분리하여 관리할 수 있습니다. 또한 각각의 사용자별로 Rule 관리에 필요한 다양한 역할을 할당할 수 있으며, 로그인 메커니즘과 LDAP 통합을 통한 손쉬운 보안 환경 구축 기능도 제공합니다. 예를 들어, 비즈니스 분석가는 Rule 저장소에 접근하여 각각의 Rule을 수정하는 것이 가능하지만, 어플리케이션 개발자는 Rule 저장소에서 특정 Rule을 읽기만 가능하고 수정은 불가능하도록 역할을 할당할 수 있습니다. BRMS는 Rule 집합 저장을 위한 단일 저장소로 사용될 수 있습니다. Pruduction Rule vs. events Production Rule은 주로 Condition(when)과 Action(then) 두 부분으로 구성되어 있습니다. (예: 운전 면허증 소지 기간이 5년 미만인 고객에게는 보험료 할증 규칙을 적용하라.). 기타 다른 유형의 Rule에는 이벤트(event)가 있습니다. 이것은 event condition action 형태의 문법을 갖습니다. 이 경우 Rule Engine은 등록된 이벤트와 일치하는 사건이 발생한 경우 해당 룰의 조건이 true인지 여부를 판단합니다. 마지막 상품이 판매되어 제품 재고가 모두 소진되었다거나, 신호등의 고장 같은 사건이 이런 이벤트에 해당합니다. Production Rule에서는 Rule Engine이 모든 action을 수행하는 시기를 개발자가 결정하지만, event를 사용하는 경우에는 해당 이벤트가 발생할 경우 관련된 action들이 실행됩니다. Rule Engine 사용 예제 먼저 Eclipse IDE를 설치합니다. Eclipse를 선택한 이유는 Eclipse 자체만으로도 Drools를 사용한 어플리케이션을 개발하기에 충분하며, Eclipse에서 사용할 수 있는 Drools Rule Engine 플러그인들이 추가적으로 제공되기 때문입니다. Eclipse IDE, Java EE 개발자를 위한 Eclipse IDE(eclipse-jee-europa-winter-linux-gtk.tar.gz) 다운로드가 끝나면 압축을 풀어서 Eclipse를 시작하십시오. 메뉴에서 Help -> Software Updates -> Find and install… -> Search for new features to install -> New Remote Site…를 클릭하십시오. “Drools IDE Update Site” 아래 있는 Drools 다운로드 페이지에 URL이 나타납니다. 이 URL은 플러그인에 대한 링크입니다. Drools 4.0.7 Eclipse Workbench for Europa 3.3의 경우에는http://downloads.jboss.com/drools/updatesite3.3/입니다. OK와 Finish를 차례로 선택하면 Eclipse에 검색 결과가 나타납니다. Next를 클릭해서 라이센스를 수락하고 Finish를 선택하면 플러그인 다운로드가 시작됩니다. 다운로드가 끝나면 Eclipse에 또 다른 창이 나타나는데, 여기에서 “Install all”을 클릭합니다. 재시작에 대해 물으면 “Yes”를 클릭하십시오. 플러그인이 성공적으로 설치되었는지를 확인하려면, 툴바에 Drools 아이콘이 새로 추가되었는지를 보면 됩니다. 이제 첫 번째 Drools 애플리케이션을 만들어보겠습니다. 툴바의 Drools 아이콘을 클릭한 뒤 “New Rule Project”를 선택합니다. 프로젝트 이름을 입력하고 Finish를 클릭하십시오. Drools 플러그인이 표준 레이아웃을 생성하고 시작에 필요한 모든 라이브러리를 제공합니다. 이 애플리케이션을 실행하려면 com.sample.DroolsTest를 클릭한 다음, “Shift + Alt + X”와 “J”를 차례로 누르십시오. 콘솔에 다음과 같이 표시됩니다. Hello World Goodbye cruel world 내부적으로 어떤 작업들이 수행되었습니까? 이 예제는 Drools와 함께 배포되는 문서에 포함되어 있는 예제입니다. Rule Engine이 초기화되고, DroolsTest.java에서 해당 Rule을 어떻게 읽어서 실행하는지에 대해서는 자세히 설명하지 않겠습니다. 여기서 우리가 주로 살펴볼 부분은 Rule 파일인 Sample.drl 파일입니다. 이 파일은 두 가지 Rule을 포함하고 있습니다. 최초 프로그램 실행시, 작업 메모리는 message 필드가 “Hello World”, status 필드가 0으로 설정된 Message 클래스 객체가 1개 존재하고 있습니다. 이 상태에서 fireAllRules() 메소드가 호출되어 Rule의 조건을 만족하는 모든 Action들이 실행됩니다. 중요한 것은 객체가 작업 메모리에 추가될 때, 각 Rule의 condition 부분의 true/false 여부가 평가된다는 것입니다. 작업 메모리에 있는 1개의 객체는 Message 객체이고, 해당 객체의 status 필드는 0이기 때문에 “Hello World”라는 규칙의 condition은 true 값을 갖습니다. 따라서, 해당 Rule의 action 부분이 실행됩니다. 그 결과, Message 객체의 상태 및 메시지 필드가 수정됩니다. update() 명령어는 Rule Engine에게 작업 메모리 내의 객체들이 변경되었으므로, Rule들을 다시 평가하도록 지시합니다. 이번에는 두 번째 Rule의 조건이 true값을 갖게 되며, 해당 Rule의 action이 실행될 것입니다. 규칙 엔진의 세계와 엄선된 Drools 애플리케이션에 대한 간단한 소개를 통해 주요 특성과 몇 가지 가능한 사용 영역에 대해 알아 보았습니다. Drools 소프트웨어에 대한 자세한 내용은 Drools 설명서를 참조하십시오. All images and content copyright © 2008 Jaroslaw Kianowski. All rights reserved. Used with permission. 본 내용은 Jaroslaw Kijanowski 가 2008년 7월 10일 목요일 오후 5시 25분에 게시했으며, JBoss 의 technical 아래에 정리되어 있습니다. RSS 2.0 피드를 통해 이에 대한 모든 댓글을 확인해 보실 수 있습니다. 여러분의 사이트에서 댓글 이나 트랙백 을 남길 수 있습니다. Drools는 국내에는 매우 생소하지만 이미 유명한 JBoss에서 나온 오픈소스형 비즈니스 로직 통합 플랫폼(The Business Logic integration Platform)이다. 또한 Java를 기반으로 하는 Rule Engine이다. 이러한 자바 기반의 오픈소스 룰 엔진에는 Drools, Mandarax, JLisa 등이 있다. Drools는 다음과 같은 Project로 이뤄져 있다. 핵심인 Expert라는 rule engine. DB를 관리하는 DBMS가 있듯 rule engine을 관리하는 Rules Manager가 있다. 바로 Drools Guvnor(Governor를 지칭)이다. 또 process와 workflow를 담당하는 jBPM 5, event processing을 담당하는 Fusion 등이 있다. Drools Guvnor (Business Rules Manager) Drools Expert (rule engine) jBPM 5 (process/workflow) Drools Fusion (event processing/temporal reasoning) OptaPlanner (automated planning) 그럼 Rule Engine인 Drools Expert는 무엇일까? Drools는 Apache Lisence 하에 배포된 ‘Java Library’이다. 모든 Library가 그렇듯 어떤 문제를 쉽게 해결하기 위해서 만들었다. Drools 홈페이지에 Expert에 대해 이렇게 설명하고 있다. Drools Expert is a declarative, rule based, coding environment. This allows you to focus on “what it is you want to do”, and not the “how to do this”. Drools Expert는 선언적 프로그래밍, 룰 기반의 코딩 환경이다. 이것은 ‘어떻게 해야 하는가’가 아닌 ‘무엇을 하고 싶은가’가 초점을 맞춘다. 다시 말해 문제를 해결하는 과정에 초점을 두지 않고, ‘문제’ 자체가 중심이라는 것이다. Rule Engine은 비즈니스 상에서 문제를 분석, 탐지하고 해결할 수 있도록 만든 환경 이다. 예를 들어 보험회사에서 보험 정책을 결정할 때 운전자의 연령이나 자동차 가격에 따라 책정 되는 상황을 결정하거나 제품의 수량이나 가격에 따라 얼마만큼 할인할 것인지에 대한 금액 등을 계산한다. 이런 실제 비즈니스 상에 풀어야 하는 문제를 분석하고 해결하는데 도움을 줄 뿐 아니라 장애 발생 상황을 의심하고 사전에 탐지하기도 한다. 여기서 Rule Engine의 핵심은 바로 추론 엔진(Inference Engine)인데, 이것의 역할은 Fact(T/F)과 RUle을 패턴 매칭을 사용해 분석하고 조건이 True인 것으로 판명되는 경우에 Rule의 Action들을 수행한다. Rule Engine에 Data가 제공되기 위해 일차 술어 논리(Firtst Order Logic)가 사용되는데, 일차 술어 논리란 ‘4 + 6 == 10’이나 ‘customer.age >= 18’ 같은 표현식처럼 True/False를 평가하는 것이다. when Customer (age > 17) then System.out.println(“Customer is full age”); 이런 소스를 Rule을 통하여 다음과 같이 나타낼 수 있다. SELECT * from Customers c WHERE c.age > 17 이 처럼 Application의 소스를 더욱 편리하게 하고 유지보수를 환경을 좋도록 만드는 데 의의가 있다. 어떤 문제 해결 방식이 너무 복잡하거나 알고리듬 안에 if-then, switch 구문이 너무 많으면 Drools를 사용할 필요가 있다. Eclipse 상에서 다음처럼 편리한 GUI를 통해 Business Logic을 관리할 수 있다. 이 책에서 Drools Project의 Guvnor, Fusion, Expert와 Planner에 대해 학습하게 되고, Spring Framework와도 연계하는 법을 배운다. 실전적인 적용은 추상적인 배움에서 매우 낯선 영역이 되곤 하는데, 보통 책들의 계단식의 추상적인 차례대로 배움 보다 실무에 익숙한 사람들을 위한 책이다. 그래서 Drools 원격 실행법이나, Declarative 서비스 생성하는 법, Spring Framework, Apache Camel 연동법도 담고 있다. 외부 DB 사용을 위한 Repository 백업과 설정하는 방법이나 REST API와 Guvnor를 상호작용하는 법하는 등 책 내용까지 절차적인(?) 방법보다 실무에 대한 선언적인 방법(?)을 사용한다는 점이다. 책 초반에 Drools에 대한 제대로 된 설명 조차 없어 당황스러웠지만(이건 좀 원서에 그런 내용이 없어도 역자들이 좀 써 넣었어야 했을 듯 싶다.), 더욱 깔끔하고 손쉽게 처리할 수 있는 방법을 소개받을 수 있다는 점이 만족스러운 책이다. Drools 홈페이지 https://www.jboss.org/drools/ So you have finished reading the 오픈 소스 룰 엔진 topic article, if you find this article useful, please share it. Thank you very much. See more: Drools 예제, Drools rule engine, Drools 란, Spring drools, Drools 사용법, Business rule engine, Drools spring boot, 드룰스

OpenRules

OpenRules Decision Manager Allows subject matter experts to build, test, analyze business decision models, and deploy them as Superfast Decision Microservices. Support millions of decisioning transactions per day with high performance and availability requirements – superfast execution of large rulesets! Can be used as a SaaS Rule Engine in AWS Marketplace Automating Business Logic OpenRules® enables business analysts to represent and maintain their business logic in the form of Executable Decision Models. They use familiar tools such as MS Excel or Google Sheets to develop, test and maintain their decision models. Goal-Oriented Approach OpenRules® supports a goal-oriented approach to decision modeling allowing business users to create complex decision models capable to reach multiple business goals and subgoals. This guide describes the simplest while intuitive way for building business decision models. ML-based Rules Discovery OpenRules® applies Machine Learning for discovering business rules based on historical data. Using an integrated Business Rules and Machine Learning approach it helps users to build ever-learning decisioning applications Decision Optimization OpenRules® includes Optimization Engines which let’s users to build decision models capable to find OPTIMAL (!) decisions based on a user-defined optimization objective. Uitilizes off-the-shelf Constraint and Linear Solvers Rules-based Questionnaires OpenRules® includes a rules-based Questionnaire Builder that allows business users to develop dynamic rules-based Web Questionnaires using simple Excel tables Accessing Databases OpenRules® allows your rules-based decision models to access relational databases by migrating SQL queries to business rules. Business & IT Work in Concert With OpenRules® business people create and test decision models and then involve IT to integrate them with the actual information systems. OpenRules clearly specifies all integration points.

삽질의 추억 삽질의 추억

Drools’ 태그의 글 목록

1. Drools 란? 2. 참고 사이트 1. Drools 란? – The Business Logic integration Platform 이다.자바 기반의 오픈소스 룰 엔진에는 Drools, Mandarax, JLisa 등이 있으며, 그중 Drools에 대해서 알아보자!단, 영어라는거…(- -)/ Drools is an Object-Oriented Rule Engine for Java. Drools is an augmented implementation of Forgy’s Rete algorithm tailored for the Java language. Adapting Rete to an object-oriented interface allows for more natural expression ..

Business Rules Management System (Java™, Open Source)

Drools is open. All dependencies of this project are available under the Apache Software License 2.0 or a compatible license.

This website was built with JBake and is completely open source.

룰 엔진으로 선언적 프로그램밍 맛보기

Drools 6.0 룰 엔진에서 선언적 프로그래밍 형태의 간단한 룰 애플리케이션을 작성해 봅니다.

선언적 프로그래밍은 ‘어떻게 해야 하는가’(How to do it) 아닌 무엇을 해야 하는가 ’What to do’에 집중하여 프로그래밍하는 방법입니다.

예를 들자면 “최댓값 구하기”를 절차적 프로그래밍 언어로 구현한다면 루프를 이용하여 값의 집합에서 각 값을 반복적으로 비교하고 최종적으로 최댓값을 구하는 코드로 작성할 것입니다.

rule-engine · GitHub Topics · GitHub

Improve this page

Add a description, image, and links to the rule-engine topic page so that developers can more easily learn about it.

Curate this topic

Rule Engine

Rule Engine

언제 rule engine을 사용해야 되는 것인가?

해결해야 할 문제가 전통적인 코드개발로는 반복적인 코드 반복이 나올때 비지니스 요구 사항을 구현하기가 쉽지만, 그것을 해결하기 위한 유연한 방법을 찾을때 비지니스 요구 사항을 구현하기가 어려울때 로직이 자주 변경으로 인해 서비스 배포가 빈번하게 일어날때 기술적이지 않은 업무영역 전문가(비즈니스 분석가)가 시스템의 룰을 읽을 수 있어야 할때

용어

Facts : 데이터

Condition : 조건

Action : 조건이 맞으면 해당하는 Action

Rule Engine 종류

Rule 엔진을 직접 구현을 해서 사용할수도 있지만 Open Source를 이용하여 구현을 할수도 있다. Rule Engine은 아래와 같은 종류의 Open Source가 있다.

Drools OpenL Tablets Easy Rules Rule Book Custom Rule Engine (직접 개발)

오픈 소스 룰 엔진 79 개의 자세한 답변 – Ko.taphoamini.com

** Drools : BRMS 엔진, 오픈소스

** 배포 : www.jboss.org 통해 배포

** Drools 의 기본 rule 파일은 DRL 파일이다.

* DRL 파일에 대한 기본 작성법을 overview 해 보자.

* rule 파일 기본 구조

rule “ ”

*

when

*

then

*

end

* name

룰의 이름이 된다.

* attribute

룰을 실행하는데 영향을 주는 속성값. 선언적인 방법을 사용한다.

** attribute의 종류

* no-loop

룰이 다른 실행결과에 따라 변경되어 재실행 되는 경우 무한 루프를 돌 가능성이 생긴다.

그런 경우에 대비하여 루프를 막아주는 속성(기본값:false)

* ruleflow-group

룰의 실행 시 실행단위로 지정해 줄 수 있는 그룹명을 설정하는 것으로 보인다.

기본값은 없다.

* lock-on-activate

정확히 뭘 하는 녀석인지 잘 모르겠다.

* salience

룰의 우선순위 설정. 기본값은 0 이고, 양수/음수 값을 사용할 수 있다.

* agenda-group

ruleflow-group와 비슷한 개념으로 보인다. 실행단위 설정같은것으로 보임

* auto-focus

룰이 활성화 되었으나 agenda-group이 아직 focus를 못 받았을 때

잠재적으로 focus를 활성화 시켜주는 옵션이라나머라나.

* activation-group

매뉴얼만 봐서는 모르겠다. 영어가 짧아서.

* dialect

java or mvel 사용언어를 지정하는 놈이다.

* date-effective

설정한 날짜에만 룰이 동작한다.

* date-expires

설정한 날짜까지만 룰이 동작한다.

* duration

룰이 동작하는 기간을 설정해준다. 타입은 long (deprecated 되었다고 함)

==> 대신 timer 속성을 쓴다. 다음과 같은 형식을 따른다.(cron 형식도 된다. 대박)

timer ( int: ? )

timer ( int: 30s )

timer ( int: 30s 5m )

timer ( cron: )

timer ( cron:* 0/15 * * * ? )

출처: https://java808.tistory.com/entry/Drools-기본-rule-작성법 [잡동사니 기술연구소^.^]

이글은 Drools 메뉴얼을 참고해 작성되었습니다.

1. Overview

Drools 3부터는 XML 기반의 텍스트 포맷이 아닌 “native” 룰 언어를 제공한다. 이 포맷은 매우 가볍고 자연스러운 도메인 기반의 언어로의 확장을 지원한다.

여기서는 이 내장 룰 언어의 주요 개념을 살펴본다. 다이어그램은 “rail road”로 알려진 다이어그램을 사용했으며, 기본적으로 언어 단위의 설명을 위해서는 플로우챠트를 사용한다.

기술적인 사항을 위해서는 룰 언어를 위한 Antlr3 의 문법파일인 “drl.g” 파일을 참조해도 좋다. 만약 룰 관련 IDE를 사용한다면, 많은 수의 룰 구조가 이미 사용자를 위해 제공된다. (contents assistance) 예를 들면 “ru” 라고 입력후 ctrl_space를 누르면, 기본 룰 구조가 생성될 것이다.

1-1. Rule file

룰 파일은 .drl 확장자를 가진 일반적인 파일이다. 하나의 drl 파일은 여러개의 룰 또는 함수들이 존재할 수 있다. 어쨋건 사용자는 많은 룰파일을 통해 룰들을 스프레드하게 펼쳐서 사용할 수 있다. (이 경우, 확장자는 .rule 이 권고되지만 필요한건 아니다) 여러개의 파일로 존재하는 룰들은 많은 수의 룰들을 관리하는데 도움이 될 수 있다. DRL 파일은 단순한 텍스트 파일이다.

1-2. 룰은 무엇을 만드는가?

룰은 아래의 러프한 구조를 가진다.

rule “name”

ATTRIBUTES

이글은 Drools 메뉴얼을 참고해 작성되었습니다.

when

LHS

then

RHS

end

정말 간단하다. 구두점(마침표)도 필요하지 않다. 심지어 룰 이름을 위한 ” 역시 옵션이며 new line 역시 옵션이다. ATTRIBUTES 역시 간단하며 항상 옵션이다. LHS 는 룰의 조건파트이다. RHS는 자바 문법코드로 실행될수 있는 코드블럭이며 (곧 다른 언어 문법도 제공될 예정이다. groovy 나 C# 같은)

단지 특별한 키워드는 FACT를 asserting, retracting, modifying 하는 부분이다. LHS에서 정의된(바인드된) 어떤 변수도 RHS 영역에서 사용할 수 있다.

주의할 점은 drl 자체에서 공백은 중요하지 않지만, Domain Specific Language에서는 예외이다.

1-3. Domain Specific Language

DSL은 기본 내장 룰언어 기반의 확장처럼 구현된다. 이것은 ‘expander” 메카니즘을 사용하며, 이것은 확장가능한 API를 의미한다.

도메인 영역 또는 자연어 기반의 언어와 사용할 도메인 모델과의 매핑을 가진 .dsl 확장자가 사용된다. DSLs/expanders 는 컴파일 타임에 룰 소스안에서 처리된다. 만약 DSL이 만들고자 하는 어플리케이션에 이익이 된다고 믿는다면 시간이 지나면 여러 도메인을 위해 사용할 수 있는 많은 부가적인 DSLs 이 가용하거나 미리 만들어져 있을 거라는 사실이 도움이 될 것이다. 주로 룰작성을 보기 좋게 도와주지만, 어떤 사람들을 위해서는 기본 내장 룰 언어가 좋을수 있다.

Freedom is good !

1-4. 예약어

룰엔진에는 룰언어에서 사용하는 약간의 미리 예약된 키워드들이 있다. 룰 작성시나, 도메인 객체, 메서드, 속성등을 정의할때 충돌이 나지 않도록 피하는게 현명할 것이다. 미리 예약된 키워드들의 목록은 아래와 같다.

when, then, rule, end, contains, metches, and, or, modify, retract, assert, salience, function, query, exists, eval, agenda-group, no-loop, duration, ->, not, auto-focus

2. 주석문

주석문의 경우 룰엔진에 의해 무시되는 문자열의 섹션이다. 룰엔진이 주석문을 만났을때 주석은 효과적으로 제거된다.

2-1. 단일 라인 주석

2-2. 복수 라인 주석

3. 패키지

패키지는 룰과 그리고 다른 관계있는 예를 들면 imports, globals 와 같은 구성물의 집합이다. 패키지의 요소들은 전통적으로 각각 다른것들과 관계가 있다.

패키지는 이름공간을 표현하고 룰의 그룹핑을 유일하게 유지할 수 있는 좋은 아이디어이다. 패키지의 이름은 그것자체로 이름공간을 의미한다. 어쨋건 그것은 파일이나 폴더와 연관이 있는것은 아니다.

일반적인 구조에서 패키지를 위한 모든룰들은 패키지 선언이 되어있는 파일에 모두 있을 것이다.

패키지 이름은 일반적인 자바 컨벤션을 사용해 선언되고 이름공간을 가지며, 스페이스를 허용하는 룰 이름과 다르게 패키지 이름은 이름 중간에 스페이스를 허용하지 않는다. “package” 나 “expander” 와 같은 구문은 어떤 룰 정의가 나타나기 전인 파일의 맨 위에 존재한다. 모든 경우에 세미콜론은 옵션이다.

3-1. import

import 구문은 자바에서의 import 구문과 같다. 룰에서 사용하기를 원하는 어떤 오브젝트를 위해서 전체 경로와 타입이름을 명시하는게 필요하다. Drools의 경우 같은 이름으로 되어 있는 자바패키지로부터 자동으로 클래스를 import 한다.

3-2. expander

expander 구문은 옵션이며, DSL 설정(보통은 별도의 파일로 저장되어 있는)을 명시하기 위해 사용된다. 이것은 해석기가 룰안에서 작성된 룰을 이해하는실마리로 제공된다.

3-3. global

Globals 은 전역변수들이다. 만약 복수의 패키지에서 같은 indentifier 의 전역변수를 선언하고 싶다면, 그것은 반드시 같은 타입이어야 하고, 모든 참조는 같은 전역값을 가르킬 것이다. 이것은 전통적으로 리턴값을 위해 사용된다. 예를 들면, 엑션의 로그나, 룰에서 사용될 서비스나 데이타를 제공하기 위해서 사용된다. Globals 는 워킹메모리로 추가되지 않으며, 룰엔진은 Globals가 변경되는지 걱정하지 않는다. 이런 이유때문에 Globals는 마지막으로 사용된 값이 없어 제약조건으로 사용되지 않는다. 제약사항으로서 globals의 올바르지 않은 사용은 놀랄만한 결과를 야기시킬 것이다. 나쁜쪽으로 놀라게 될것인데, 아마도 의사가 당신의 XRay를 보고서 “매우 흥미롭군요” 라로 말하는 느낌일 것이다.

이것은 원한다면 어떤 오브젝트라도 당신이 룰에서 넘겨받아 사용할 수 있다는 것을 의미한다. 서비스 위치지정자, 또는 서비스 자체를 넘겨줄 수 잇다.

예를 들면 이메일 서비스의 인스턴스를 넘겨줄 수도 있다. DRL안에서 당신은 이메일 서비스 타입의 global을 가질수 있고 그것에 이름을 “email” 이라고 지정해 줄 수 있을 것이다. 그런 다음 룰의 엑션부분에서 당신은 email.sendSMS(number, message) 와 같이 사용할 수 있을 것이다.

3-4. Fnuction

함수는 룰소스 안에서 일반적인 자바 클래스 안에서 적당하지 않은, 의미있는 코드를 넣는 방법의 하나이다. 물론 핼퍼 클래스를 작성하면 함수는 별 소용이 없을 것이다. (사실은 룰엔진에서 컴파일시에 핼퍼 클래스로 만들어진다)

룰에서 함수를 사용하는 가장 주요 이점은, 한 장소에 모든 로직을 모아서 유지할 수 있다는 것이다. 그리고 당신은 필요에 따라 함수를 수정해서 전체 룰안에서 변경내용을 반영시킬 수 있다. 함수는 룰의 “then” 파트, 즉 실행영역에서 엑션을 실행시키기 위해 대부분 사용된다.

전통적인 함수의 선언은 다음과 같을 것이다 :

function String calcSomething(String arg) {

return “hola !”; }

function에 인자가 필요없을 경우 인자를 넘겨줄 수 없다. 룰안에서 함수를 호출하기 위해서는 (아마도 consequence 또는 eval 안에서) 간단히 함수의 이름을 적어주고 파라미터를 넘겨주면 된다. method 호출과 비슷하다

function 의 대안중 하나로는 핼퍼 클래스의 static 매서드가 될 수 있다. Foo.doSomething 과 같은, 또는 Global 로 선언된 핼퍼 클래스나 서비스의 인스턴스로 파라미터를 넘겨줄 수도 있다.

3-5. 룰 (Rule)

룰 구조는 명백하게 가장 중요한 구조이다. 룰은 “IF” 어떤것과 “THEN” 엑션의 폼이다. (물론 우리가 알다시피 키워드는 “when” 과 “then” 이다)

룰은 반드시 이름을 가져야 하며, 그리고 룰 패키지 안에서 이름은 유니크해야 한다. 만약 룰이름 사이에 공백이 들어간다면 룰 이름은 ” 로 감싸줘야 한다.

속성의 경우 옵션이다.

위에서 보는바와 같이 룰의 종료 키워드는 “end” 이며, 룰은 물론 중첩될 수 없다.

3-5-1. LHS

LHS는 보통 룰의 조건파트라고 불려진다. 자세한 사항은 아래의 다이어그램을 참조하기 바란다.

패턴은 아래와 같이 설명된다.

3-5-2. RHS

RHS는 룰안에서 일반적으로 엑션파트 또는 결과파트로 불려진다. RHS 파트의 목적은 워킹메모리에서 facts 를 추가하거나 수정하거나 삭제하는데 있다. 그리고 또한 어플리케이션을 위해 명시된 엑션을 호출하기도 한다. 실제적으로는 룰이 fire 될때 실행되는 코드블럭이다.

여기에 워킹메모리를 수정하기 위해서 사용가능한 몇가지의 편리한 매서드들이 있다.

“modify(obj);” 은 룰엔진에 객체가 수정되었음을 알려주고 룰들은 변경된 객체를 기반으로 다시 판단될 것이다.

“assert(new Something());” 은 워킹메모리 안으로 새로운 객체가 생성되었다는 것을 알려준다.

“assertLogical(new Something());” 은 assert 와 비슷하다. 그러나 현재 firing 된 룰의 참값을 위해서 더 이상의 facts가 없을때, 자동으로 삭제될 것이다.

“retract(obj);” 은 워킹메모리 안에서 객체를 제거한다.

이 편리한 매서드들은 기본적으로 KnowledgeHelper 객체의 바로가기를 제공하기 위한 매크로이다. 더 자세한 작동을 알고 싶다면 KnowledgeHelper 클래스를 참조. KnowledgeHelper 인터페이스는 기본적으로 RHS 코드 블럭을 drools 로 불려지는 변수처럼 유용하게 만들어준다. 만약 “Property Change Listeners” 를 자바빈에서 제공한다면, 룰엔진에 해당 객체가 추가된 후에 객체가 변경이 되었을때 “modify” 를 호출해야 하는것을 피할 수 있다.

3-5-3. Rule Attribute

default value : false

type : Boolean

default value : 0

type : integer

default value : MAIN

type : String

default value : N/A

type : String

default value : N/A

type : String

default value : no default value

type : long

약간의 속성을 사용한 룰의 사용예를 작성해 보면 다음과 같다.

rule “my rule” salience 42 agenda-group “number 1” when …

3.5.4 Column

코드 예시:

Cheese() Cheese( type == “stilton”, price < 10) 룰은 하나 이상의 오브젝트 타입에 따라 필드의 제약조건으로 구성된다. 내부적으로 매치된 각각의 오브젝트 타입의 인스턴스는 배열로 저장된다. 만약 Person, Person, Pet 세개의 오브젝트에 대해 매치를 수행하게 되면, 배열에 세개의 요소가 존재하게 된다. Drools안에서 Tuple 처럼 이 Facts의 리스트를 참조한다. 배열안에 각각의 요소들은 컬럼이다. 각각의 오브젝트 타입의 인스턴스는 0 이상의 필드 제약조건을 통해 필터링된다. 컬럼항목은 오브젝트 타입상에서 제약조건의 리스트를 위해 참조된다. 위의 코드 예시에서 첫번째 줄과 같이 어떤 제약조건도 없다면 워킹메모리의 어떤 치즈도 매치가 될것이다. 두번째 줄의 경우는 치즈 오브젝트의 인스턴스에 대해서 두개의 문자필드 제약사항을 참조한다. 제약조건들은 콤마에 의해 구분되고, 묵시적으로 "and" 를 의미한다. 상기 다이어그램에 표기된 컬럼의 바인딩은 아래와 같이 코드로 표현된다. cheapStilton : Cheese( type == "stilton", price < 10 ) 필드 바인딩은 이전 경우와 비슷하지만, 치즈의 인스턴스에 변수를 바인딩하는 케이스이다. 이것은 cheapStilton 객체를 다른 조건에 사용할 수 있는것을 의미하거나, 아마도 룰의 실행부분에서 사용할 수도 있다. 당신은 또한 그것을 먹을수도 있겠지만, 나는 그러지 않았다. 3-5-4-1. Field Constraints 필드 제약사항은 룰엔진을 위해 워킹메모리로부터 매치되는 Fact 오브젝트들을 제약한다. 이것은 Fact 오브젝트 인스턴스로부터 "field" 값을 측정하고 비교한다. 여기서 필드는 클래스의 public, private 멤버 변수로서의 필드가 아니다. 필드는 접근가능한 매서드이다. 만약 오브젝트가 자바빈 패턴을 따른다면, 필드는 노출된 "getXXX" 또는 'isXXX" 메서드이다. 이것은 매서드가 인자가 없다는 것이고 무엇인가를 리턴한다는 의미이다. 당신은 빈이름 컨벤션을 사용해서 필드에 접근할 수 있다. (예를 들면 "getType" 은 "type" 으로 접근가능하다) 예를 들면, 우리의 치즈 클래스를 참조할 때, Cheese(type == ...) 라는 것은, 치즈 인스턴스상의 getType() 메서드를 사용한다. 물론 getter 매서드가 아닌것들도 접근가능하다. toString() 같은. 이럴 경우 Cheese(toString == ..) 와 같이 매서드의 전체 이름을 통해 접근하며 괄호는 필요없다. 매서드들을 인자없이 접근한다는 것을 명심하라. 그것이 접근자(accessors) 다. 이 접근자는 룰의 효율성의 도모하기 위한 방법으로 오브젝트의 상태를 변경하지 않는다. 룰엔진은 더 빠른 결과를 위해 invoke되어 매치된 결과를 효율적으로 캐쉬한다는걸 기억하라. 만약 필드를 위해 primitive 타입을 사용했다면 Drools는 그것들을 그것에 상응하는 오브젝트로 autobox 할것이다(심지어 자바 1.4 버전을 사용하더라도). 어쨋든 현재 자바 1.4에서 그것들은 더이상 auto-unboxing 되지 않는다. 전체적으로 룰안에서 사용될 모델 오브젝트 상에서 primitive 타입을 사용하지 않는 것이 아마도 최선일 것이다. 만약에 당신이 Java 5 를 사용한다면 양쪽 측면에서 모두 최선이다. (컴파일러에게 autobox 를 지정할 수 있다) 만약 당신이 Java 5 를 사용하고 당신이 JDT semantic 컴파일러를 사용한다면 (JANINO 는 아직 Java 5를 지원하지 않는다) Drools 는 당신을 명예롭게 여길것이다. 3-5-4-1-1. JavaBeans as facts JavaBeans 노트 : 자바빈즈 컨벤션은 아래와 같다. 그러나 아래에 보여지는 것처럼 메서드 이름을 사용해서 getter 매서드들을 접근할 수 있다. 문법은 대소문자를 구분한다. 대문자를 사용한 "getURL" 같은 getter 매서드들의 경우, 속성의 이름은 "URL" 이다. "get" 이후에 하나 이상의 대문자가 있을 경우, 이렇게 하는것이 정확하게 자바빈즈 표준이다. (사실은, Instrospector 유틸이 사용된다) 3.5.4.1.2 Operator (연산자) 다양한 필드 제약사항과 함께 사용할 수 있는 여러개의 연산자가 있다. 올바른 연산자는 필드의 타입에 의존한다. 일반적으로 데이타의 타입에 기반해 연산자는 자체적으로 해석될 수 있다. 예를 들면, 날자 필드에 대해 ", =. <= Cheese( quantity == 5) [Date] 현재는 단지 "dd-mmm-yyyy" 데이타 포맷만 기본으로 지원한다. 시스템 프로퍼티("drools.dateformat) 처럼 기본 데이타 포맷 마스크를 사용해서 커스터마이징 할 수 있다. 만약 추가적인 포맷이 요구된다면, 미리 정의해서 사용하기 바라며, 올바른 연산자는 아래와 같다. ==, !=, >, =. <= Cheese( bestBefore < "27-Oct-2007" ) [String] 어떤 유효한 자바 스트링도 가능하며, 올바른 연산자는 아래와 같다. ==, != Cheese(type == "stilton") [Boolean] 단지 true, 또는 false만 사용이 가능하다. 0 또는 1은 인식되지 않으며 Cheese( smelly )와 같은 표현도 인식되지 않는다. 가능한 연산자는 아래와 같다. true, false Cheese( smelly == true) [Matchs Operator] 어떤 자바 정규표현식이 스트링 필드에 대해 매치로 사용가능하다. Cheese( type matches "(Buffulo)?\\S*Mozerella" ) [Contains, Exclude Operator] 이것은 특별한 연산자이며, 필드의 컬렉션이 오브젝트를 포함하는지, 포함하지 않는지 체크하는데 사용된다. CheeseCounter( cheeses contains "stilton" ) CheeseCounter( cheeses excludes "chedder" ) [Bound Variable Constraints] 변수들은 Fact들, 또는 그것들의 필드들에 대해 바운드 될수 있다. 그리고 이것들은 다른 필드의 제약사항으로 사용될 수 있다. 바운드된 변수들은 Declaration 이라고 불린다. Declarations 는 "matches" 와 같이 사용될 수 없다. "contains" 연산자와 같이 동작한다. 강요된 필드의 타입에 따라 올바른 연산자가 결정된다. 바운드 변수들은 연산자가 매우 빠른 실행과 향상된 성능을 위해 특별한 "==", "=!" 가 제공된다. Person( likes : favoriteCheese ) Cheese( type == likes ) likes는 바인딩된 변수, 즉 Declaration 이다. 이것은 어떤 Person 인스턴스에 매칭되는데 사용되기 위해 favorateCheese 필드에 바인딩 되어있다. 자바에서 사용가능한 어떤 유효한 변수명이라도 사용할 수 있으며, 다른곳에서도 필드이름과 차별할 수 있도록 종종 사용되는 '$' 문자를 사용할 수 있다. 아래의 예제 코드에서는 '$'를 사용하고 있고 컬럼 오브젝트 타입의 인스턴스에 바인딩이 되는 것을 보여주고 있다. 그리고 바인딩된 Fact 는 'contains' 연산자를 사용할 수 있다. $stilton : Cheese( type == "stilton" ) Cheesery( cheeses contains $stilton ) 3.5.4.1.5 단정적인 (Predicate) 제약사항들 단정적인 제약사항은 어떤 유효한(primitive boolean 으로 평가될 수 있는) 자바 표현식이건 사용할 수 있다. Declaration identifiers 처럼 Drools 의 키워드의 사용은 피해야 한다. 이전에 바운드 선언은 표현안에서 사용되었다. 단정적인 제약사항안에서 사용되는 함수는 반드시 리턴 시간이 일정한 결과로 나와야 한다. 아래의 예제는 "Return Value 연산자"를 사용해 남성보다 2살많은 남성/여성의 모든 쌍을 찾는다. Person( girlAge : age, sex = "F" ) Person( boyAge : age -> (girlAge.intValue() == boyAge.intValue() + 2), sex = “M” )

3.5.4.1.6 Return Value 제약사항

리턴밸류 제약사항은 오브젝트를 리턴하는 어떤 유효한 자바의 표현식이라도 사용할 수 있다. 그것은 primitives 를 리턴할 수 없다. Drools의 키워드 사용을 피하고 함수같은 경우 리턴 결과시간이 일정한 함수가 사용된다. 선언적인 제약사항 예제와 같이 모든 남성/여성 쌍을 찾는 아래의 예제는 여성보다 2살많은 남성의 쌍을 찾는다. 여기서는 boyAge 에 바인드를 사용하지 않는것을 주의해서 보기 바란다. 읽기에 좀 더 쉽게 만들었다.

Person( girlAge : age, sex == “F” ) Person( age == (new Integer(girlAge.intValue() + 2) ), sex == ‘M’)

3.5.5 조건항 (Conditional Element)

조건항은 하나이상의 컬럼과 작업한다. 가장 일반적인 하나는 여러개의 컬럼을 가지는 LHS안에서 묵시적으로 사용되는 “and” 이다. ‘and’를 만족했을때 그것이 하나이상의 fact와 매치되어도 선언은 단지 하나의 Fact만 참조가능하다. 어떤 fact가 바인드를 위해 참조되는가?

3.5.5.1. ‘ and’

유효한 하위 조건 : and, or, not, exists, column

Cheese( cheeseType : type) && Person( favouriteCheese == cheeseType) Cheese( cheeseType : type) and Person( favoriteCheese == cheeseType)

3.5.5.2. ‘or’

유효한 하위 조건 : and, or, not, exists, column

Person( sex == “f”, age > 60) || Person( sex == “m”, age > 65 ) Person( sex == “f”, age > 60) or Person( sex == “m”, age > 65)

바인딩과 같이 사용되는 or

pensioner : ( Person( sex == “f”, age > 60 ) or Person( sex == “m”, age > 65 ) )

‘or’ 조건항 은 sub rule 이라고 불리는 여러개의 룰을 생성하는 결과를 낳는다. 위의 예제는 내부적으로 두개의 룰을 생성한다. 이 두개의 룰은 워킹메모리 안에서 독립적으로 작동한다. 이것의 의미는 각각이 매치되어 활성화되고, fire되는 것을 의미한다. 이것에 대해 지름길은 없다.

가장 좋은 방법은 OR 조건항의 경우 두개의 룰을 생성하는 간단한 방법이라고 생각하는 것이다.

3.5.5.3 ‘eval’

유효한 하위 : none

Eval 은 어떤 의미적인 코드(primitive boolean 을 리턴하는)가 실행되는 것은 허용하기 위해서는 필수적이다. 이것은 LHS에서 바이드된 변수를 참조할 수 있다. 그리고 룰 패키지안의 함수역시 사용가능하다. eval 은 또한 룰의 LHS의 마지막 조건항이 될수도 있고, 룰안에서 여러개의 eval 을 가질수도 있다.

일반적으로 어떤 컬럼 제약조건과 더불어 eval 을 조합해 사용할 것이다.

eval 은 인덱스화 될 수 없기때문에 최적화된 필드 제약조건 같지는 않다. 어쨋건 필드의 제약조건에서 허용되지 않는 리턴값의 시간이 변하는 함수가 있을때 사용할 수 있는 좋은 아이디어다. 룰의 모든 다른 조건항들에 eval은 각각의 시간을 체크할 수 있다.

Drools 2.x 대 버전과 유사한 형태로, 에전 Drools의 파라미터와 조건 태그는 접근가능한 타입으로 변수와 바인딩되는 것과 동일하다. 그리고 그것을 eval 노드안에서 사용한다.

p1 : Parameter() p2 : Parameter() eval(p1.getList().containsKey(p2.getItem()) ) eval(isValid(p1, p2) ) //이것은 isValid 라고 이름된 함수가 있다는걸 가정한다.

3.5.5.4. ‘not’

유효한 하위요소 : Column

‘not’은 로직의 존재상 기호의 첫번째 순서이며, 워킹메모리안에서 어떤것의 존재성 여부를 체크한다. 현재 단지 컬럼만이 ‘not’ 연산안에 포함될 수 있지만 다음 버전에서는 ‘and’ 그리고 ‘or’ 역시 허용될 것이다.

not Bus()

not Bus(color == “red”) not ( Bus(color == “red”, number == 42) ) //괄호는 옵션이다

3.5.5.5. ‘exists’

유효한 하위 : Column

‘exists’는 로직의 존재상 기호의 첫번째 순서이며, 워킹메모리 안에서 어떤것의 존재성을 체크한다. “exists” 를 의미론적으로 생각해보면 “적어도 하나..”라고 생각할 수 있다. 그 자신의 컬럼을 단지 가질수 있는점에서 차별화 된다. 만약 컬럼과 같이 exist를 사용한다면, 룰은 워킹메모리 안에서 얼마나 많은 데이타가 있는지 가이드가 없이 단지 조건과 매치되는 룰이 활성화 될것이다.

현재 컬럼만 ‘exists’ 연산안에 포함될 수 있지만, 다음 버전에서는 ‘and’ 와 ‘or’ 역시 허용될 것이다. 적어도 하나의 버스를 표현하는 코드는

exists Bus()

적어도 하나의 빨간 버스를 표현하는 코드는

exists Bus(color == “red”)

3.5.5.6 ‘group’

그룹핑은 대수학에서 괄호를 사용하는 것과 유사하다. 그것은 연산의 순서를 명시적으로 만드는데 사용된다.

… ( Message( status == Message.HELLO ) and Message(message != null) or Message(status == null) ) …

마지막으로 룰 예제하나를 보면 아래와 같다

rule “Approve if not rejected” alience -100 genda-group “approval” when not Rejection() p : Police(approved == false, policyState : status) exists Driver(age > 25) Process(status == policyState) then log(“APPROVED: due to no objections.”); p.setApproved(true); end

자바5는 primitives와 적당한 타입 사이에 autoboxing 과 unboxing 을 지원한다. 이것은 코드를 읽기 매우 쉽고 편리하게 만든다. 어쨋건 Drools의 경우 J2SE 1.4 이상에서 구동된다. 그러므로 우리는 autobox 을 가지게 되었다. 참조된 필드는 자동으로 적절한 오브젝트 타입으로 autobox 된다.

이미 객체 타입이라면 아무런 변화도 발생하지 않는다. 어쩃건, unboxing 이 자동으로 되지 않는 사실은 중요하다. 그러므로 객체 모델에서 int 타입의 필드가 바인드 되었다면, 그것은 룰안에서 객체처럼 행동할 것이다.

일반적인 룰안에서 가능하다면 필드를 객체 타입을 사용해라. (적어도 자바5가 아니라면) 또한 적어도 필드를 오브젝트 타입처럼 생각해라. 다른 특별한 사항으로는 리턴값을 위한 제약사항이 있다. 리턴값의 코드조각은 반드시 primitive 가 아니고 객체를 리턴해야 한다. 자바안에서는 모든것이 오브젝트가 아니라는 사실은 이처럼 두통을 유발한다.

3.6 Query

쿼리는 단지 룰의 LHS 구조를 포함한다. ‘when’이나 ‘then’ 을 명시하지 않는다. 그것은 워킹메모리 안에서 조건상태와 매치되는 facts를 질의하기 위한 간단한 방법이다.

결과값을 받기 위해서는 WorkingMemory.getQueryResults(“name”) 구문을 사용하라. 여기서 “name”은 당연히 쿼리의 이름이다. 쿼리의 이름은 RuleBase에서 전역으로 사용할 수 있다. 그러므로 같은 RuleBase 를 위해 다른 패키지 상에서도 같은 이름의 쿼리를 추가하지 말아야 한다.

쿼리 결과의 리스트는 쿼리와 매치된 객체들을 얻을수 있도록 허용한다.

아래의 예제는 나이가 30 이상인 모든 사람들을 가져오는 간단한 쿼리이다.

query “people over the age of 30” person : Person( age > 30 ) end

‘for’ 루프를 이용해서 리턴된 쿼리의 결과를 반복할 수 있다. 리턴된 쿼리결과에서 각각의 행은 Tuple 안에서 각 컬럼에 접근하는데 사용될 수 있다. 이 컬럼은 인덱스 위치나 바운드된 선언명에 의해 접근 가능하다. 아래의 예제를 참고하라

QueryResults results = workingMemory.getQueryResults(“people over the age of 30”); System.out.println(“we have ” + results.size() + “people over the age of 30”); System.out.println(“These people are over 30:”); for (Iterator it = results.iterator; it.hasNext();) { QueryResult result = (QueryResult) it.next(); Person person = (Person) result.get(“person”); System.out.println( person.getName()); }

3.7 Domain Specific Language

이전에 이미 얘기했듯이, DSL은 당신의 문제영역을 위해 룰언어를 확장될 수 있는 방법이다. 이것은 사용자를 위해 룰언어 안으로 연결되고 모든 모호한 룰언어와 룰엔진의 기능을 사용할수 있도록 돕는다.

3.7.1 언제 DSL을 사용하는가?

생략.

3.7.2 수정 그리고 DSL 관리하기

생략

생략

생략

There is a Person with name of “kitty” –> Person(name=”kitty”) Person is at least 42 years old and lives in “atlanta” —> Person(age > 42, location=”atlanta”) Log “boo” —> System.out.println(“boo”) There is a Person with name of “bob” and Person is at least 30 years old and lives in “atlanta” —> Person(name=”kitty”) and Person(age > 30, location=”atlanta”)

생략

3.7.3 룰안에서 DSL 사용하기

컴파일 시점에 DSL을 사용하고 룰을 실행하기 위해서는 DSL 설정소스와 룰소스를 같이 넘겨줘야 한다

PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( source, dsl); //Source is a reader for the rule source, dsl is a reader for the DSL configuration

또한 룰 소스파일에는 아래처럼 특정 expander 선언이 필요하다

expander your-expander.dsl

생략

조건에 제약조건을 추가할때는 아래와 같이 처리한다.

큐브리드, 국산 오픈소스 DB 호스팅

http://www.etnews.co.kr/news/detail.html?id=201004020140

… 큐브리드(대표 정병주)는 심플렉스인터넷(대표 이재석)이 운영하는 ‘카페24’를 통해 국산 오픈소스 데이터베이스 큐브리드 호스팅을 시작했다고 4일 밝혔다.

큐브리드 호스팅 서비스는 IT 관리자가 간편하고 쉽게 이용할 수 있도록 웹 어드민을 제공한다. 국내에서 많이 사용되는 제로보드, 그누보드, 테터툴즈 등을 큐브리드 기반으로 설치할 수 있다. 큐브리드 호스팅 서비스는 하드 10G를 월 2만2000원에 사용할 수 있다.

2010-04-05 전자신문… 큐브리드(대표 정병주)는 심플렉스인터넷(대표 이재석)이 운영하는 ‘카페24’를 통해 국산 오픈소스 데이터베이스 큐브리드 호스팅을 시작했다고 4일 밝혔다.큐브리드 호스팅 서비스는 IT 관리자가 간편하고 쉽게 이용할 수 있도록 웹 어드민을 제공한다. 국내에서 많이 사용되는 제로보드, 그누보드, 테터툴즈 등을 큐브리드 기반으로 설치할 수 있다. 큐브리드 호스팅 서비스는 하드 10G를 월 2만2000원에 사용할 수 있다. 기사입력

오픈소스SW 기술 개발정보 요약

CUBRID 복제 구성하기 – 단일 서버에 구성 방법 포함

네이버 개발자 센터 – CUBRID

# 미들웨어 연구 참고자료

OpenRuleBench: An Analysis of the Performance of Rule Engines

OpenRuleBench User’s Manual

Banking Benchmark Performance: OPSJ vs Jess vs Drools

Benchmarking Drools

Parallel Jess

XSB – C/C++ linkable Rule Engine

CLIPS

CLIPS Tutorial

SEG 7450 Expert Systems and Decision Support

CLIPS at Sourceforge

CLIPSMM

Embedding CLIPS with C++ application

Programming a Knowledge Based Application

CLIPS Wiki

CLIPS 는 뭐가 문제일까?

Erlang

Message Passing Concurrency, For The Win

Erlang Programming … Tech Videos, ScreenCasts, etc.

Erlang on Slideshare

ERESYS

EIPP

=> 음 이런 시스템을 개도국 중견기업을 상대로 제시하고 협력 사업을 찾으면 좋을 거 같은데~도안구 2009.02.01 블로터닷넷… SKC&C 오픈소스소프트웨어 담당 이덕재 차장은 “초기엔 비용 절감 부분에 중점을 두고 접근하지만 오픈소스의 궁극적인 목적은 기술을 내재화하는 것입니다”라고 오픈소스에 주목하는 이유를 밝혔다…. 네이버의 DB인 CUBRID에 대한 내용들이 공개되고 있다.CUBRID 데이터베이스 HA, QA, 마이그레이션, 복제 등 고급 기술들에 대한 개발, 또는 활용 경과와 활용방법등이 온라인 강의로 제시된다.네이버가 구글처럼 DB 자립을 위해, 클라우드용 DB를 만들어가기 위해 기술개발에 열을 올리고 있음을 알 수 있다. 2009년 이후 국내 기업고객들, 관공서, 인터넷 기업 고객들이 늘고 있는 점도 기대해볼만 하다…. 여러 룰엔진에 대한 벤치마크. 미리 여러가지 오픈소스, 상용 룰엔진들을 테스트 해준 페이퍼가 나와서 반가왔다…. 은행에서 사용하는 규칙을 넣어서 Drools, Jess, OPSJ 6 등 3가지 .Java 기반 룰엔진 성능을 비교한 자료 ( 26 August 2009)… Drools 에 대한 룰 조건별 성능 시험 자료.I have quoted below the results for 588 facts being inserted into the rule engine, with the rules being repeated through 50 iterations to get the average time in milliseconds to process the cashflows and obtain the account balance for each accounting period.1 – 79 ms – Stateful2 – 27 ms – Stateful, Cached3 – 9 ms – Stateful, Cached, group conditions4 – 21 ms – Stateful, Cached, group conditions, long primitive5 – 21 ms – Stateful, Cached, group conditions, Long6 – 6 ms – Stateful, Cached, group conditions, aggregate cashflows7 – 6 ms – Stateless8 – 4 ms – Statless, Accumulate9 – 1 ms – Java… Jess runle engine 을 여러인스턴스를 만들어 병렬처리하는 기술을 설명하고 있다.이전 세대의 룰엔진 병렬처리 시도들과 비교하여 상세하게 소개하고 있음…. XSB is a Logic Programming and Deductive Database system for Unix and Windows. It is being developed at a number of institutions, including the Computer Science Department of Stony Brook University, Universidade Nova de Lisboa, XSB, Inc, Katholieke Universiteit Leuven, and Uppsala Universitet.쓰는 곳들이 많고 Prolog 언어와 추론 데이터베이스를 함께 갖고 있는 룰엔진이다. 소스는 C로 되어 있다. 성능이 매우 우수한 편인데, 확장 라이브러리를 사용하면 멀티 쓰레딩이 된다. 룰엔진 중에 멀티쓰레딩이 제대로 되면서 Java가 아닌 C 성능을 바란다면 이놈을 추천한다.근데, Prolog를 이해하려니 논리학과 약간의 수학실력을 점검해야 할 것 같다. 룰 처리는 그렇다 치고 이제 남은 숙제는 태스크 스케쥴러 하고는 어떻게 엮는다? 단순히 수집된 정보를 분석하고, 필터링하고, 정합시키고 하는 거면 룰엔진을 거치면 되는데… 태스크 스케쥴러는 어떻게 연관시키나?… C/C++용 룰엔진이다. 부가 툴 중에 CORBA 인터페이스와 IFR을 통해 CORBA 서버 호출을 지원한다. NASA에서 사용하는 전문가 시스템 기반의 룰엔진이다. CLIPS 최신 버전은 소스포지 사이트를 참고해야 한다…. CLIPS를 이용한 전문가 시스템 구축에 대한 강의록… C++ interface to CLIPS…. 런타임 엔진을 C나 C++, 또는 JNI로 불러들여서 사용하는 방식으로 활용한다.따라서, 정확이 한번에 한개의 런타임만 실해되어야 한다. 동시에 두개의 런타임을 실행해서는 안된다. 공유라이브러리로 만들되 이를 불러다 쓰는 놈들이 한번에 하나의 런타임만 불러 쓰도록 해야 한다. 시간이 긴 룰을 돌릴때는 밀린다. 런타임 엔진 내에서는 병렬성이 없다. OTL…. Erlang에 대한 발표자료. 패키지 구성을 쉽게 이해할 수 있다…. Erlang에 대한 동영상 강좌들이다…. Slideshare 에 소개된 Erlang 자료들이다. Erlang 을 공부하는 데 많이 도움이 되시기를…. erlang 언어를 이용해서 만든 전문가시스템(룰엔진) 라이브러리이다.여러개의 엔진을 띄울 수 있다고 하니 병렬성은 보장될 수 있겠다. 온톨로지 툴도 제공된다…. Erlnag을 C++에서 사용하는 방법이 나와있다. port 라는 것을 이용하는데, Erlang 에서 포트는 다음과 같이 정의되어 있다. Erlang 의 장점은 Erlang 안에서는 동시에 동작하는 병렬 프로그램이 가능하다. 포로세스 개념이 없고 메시지 패싱을 사용하는 함수적 프로그래밍 언어이기 때문이다. 음… 공유 데이터가 없고 이걸 언어 내에서 메시지 패싱으로 처리한다. 처리 속도도 매우 빠르다. Erlang은 Ericson 이 교환기용으로 만든 언어고 소스코드도 공개되어 있다. (Mozilla와 유사한 자체 라이센스방식을 사용.)

A port is an erlang process that starts an external OS process (C++ app, Python script, whatever). Messages sent to this port will arrive to the application in the form of standard input. When the application wants to communicate back, it can do so by using standard out.

Conceptually, that’s it!

There are a few gotchas: Whatever goes on between erlang and the external process (stdin, stdout) are byte streams (not characters) and unless you want to go through the pain of rolling your own binary protocol, erlang will send and expect messages to be encoded as ETF — the Erlang Term Format.

..which is where this library comes in: It will decode the byte stream to a nice object model. You can then build your response using the same object model, encode them and send them to the erlang port.

Facebook at Erlang

Erjang

tinch++: Distributed Erlang nodes in C++

EPSI

Erlang HIPE Speed than g++

Erlang 용 바이트스트림

ORBER

ErlyWeb

CEAN

… Facebook이 Erlang 으로 개발되었는데 그 내용을 설명한 자료…. Java VM안에서 Erlang 바이트 코드를 해석해서 사용하는 방식의 새로운 기술인 Erjang을 소개하는 자료임. Java 프레임워크의 actor 모델이 서버 proxy에서 mutex lock을 심하게 다룰 수 밖에 없어서 이 actor 를 erlang 객체와 메시지 패싱으로 비동기적으로 처리하면 적은 자원으로 고성능을 낼 수 있음에 착안하여 만들었다. 현재 OTP를 80% 정도 이식하고 있다고 하는데 기대가 된다…. 2010년에 공개되었다. 제작자가 Java로 Erlnag 을 인터페이스하는 Jinterface를 개발해서 쓰다가 C++로도 할 필요가 있어서 만들었다고 한다. port로 메시지를 보내는 것 외에도 호출이 가능하다. 컴파일 할래면 boost 1.4.x가 필요하다. Erlang 에서 C++ 프로세스나, 코드를 불러서 실행 시키는 방법을 없을까? 보통 런타임 언어기 때문에 같은 생명주기로 다루기는 어렵다고 하는데, 그나며 포트로 주고받으니 다른 언어서 Erlang엔진쪽으로 요청을 보내는 것은 쉬워도 Erlang에서 다른 언어의 함수나 라이브러리 기능을 호출하는 것은 위험해 보인다. 차라리 Erlang 아웃 포트에 바인딩된 C++이나 Java 리스너가 컨테이너쪽으로 메시지를 보내서 컴포넌트를 호출하고 그 결과를 받아서 돌려주는 구조가 낳겠다. 시리얼라이제이션이나 복잡한 데이터 패싱은 어려워 보인다. Erlang과 C++또는 Java 언어와 표준 메시지 프로토콜이 필요해 보인다. 아니면 타입변환 툴이 있어 주던가…. Erlang용 Publish/Subscribe 인프라스트럭쳐이다.EPSI (Erlang Publish-Subscribe Infrastructure) is an Erlang implementation of a distributed infrastructure providing a content-based publish-subscribe service to its clients…. Erlang 의 메모리사용, 처리시간, 코드 양을 g++과 비교하였다. Java보다 빠른 언어는 아니다. 알로리즘만 보자면. 하지만, 병렬성, fault 시에도 VM이나 시스템에 영향이 없는 점, 함수적 프로그램이 쉬운 점, 미들웨어 메커니즘이 내장된 점 등은 장점이다…. Erlang 용 바이트스트림 라이브러리를 만들어 FIX 프로토콜 해석 솔루션을 제공한 사례…. 뭐야! ERlang 시스템에 CORBA ORB도 있다는거군. 이놈 만져서 C++하고 Java 호환시키면 되겠다. 필요하니까 Ericson이 직접 만들어 넣었다. Erlang을 깔면 자동으로 들어가 있다. 클라이언트 용도는 충분하다. 간단한 서버 용도도 되고. 다만, 프로토콜을 빠른 놈으로 플러그인 시켜야 하는데… TAO하고 ACE 소스 거기서 찾아서 이식해야 할거 같다. (누가 해놨으면 좋으련만.)… Erlang 으로 만든 웹 프레임워크다….Perl의 CPAN처럼, Erlang은 CEAN이 있다. Comprehensive Erlang Archive Network.재미있는 것은 OTS까지 들어가 있다는 점이다. Erlang 은 OTP 패키지 안에 CORBA, CORBA Service가 포함되어 있고, Real-time Database인 Mnesia까지 들어 있다. 그런데, DB를 연결할래면 IIOP나 고유의 Erlang Erl_Interface를 사용해야 한다고 적혀있다. 그럼 룰엔진 라이브러리인 ERESYS까지 함께 써볼만 하겠다. 야호~

The Mnesia_Session application enables access to the Mnesia DBMS from foreign programming languages (i.e. other languages than Erlang). The Mnesia_Session interface is defined in IDL (an Interface Definition Language standardized by OMG (the Object Management Group)). Access is enabled via the following protocols:

IIOP (Internet Inter ORB Protocol) standardized by OMG.

the proprietary distribution protocol of Erlang Erl_Interface.

Build Your Next Web Application with Erlang

Erlang으로 MMOPRG 서버 만들기

GradSoft

Managing Business Logic with Symbolic Computation

TAO – The ACE ORB

Dave Bryson, Steve Vinoski • Verivue… 요즘 CORBA 의 아키텍트중 리더였던 Steve Vinoski 씨가 IONA에서 은퇴한 뒤 Restful과 Erlang기반의 프레임워크를 만드는 중이다. 웹이 동적인만큼 동적인 언어를 사용할 필요가 있다는 것인데… 안전하고 병렬처리가 가능한 그런 게 필요하다는 주장으로 들린다. 한번 읽어볼만한 내용이다…. 한국내 MMORPG 개발자의 블로그이다…. 최근 공개한 오픈소스 SVN 트렁크는 다음과 같다.Rule Engine & related Tools. TermWare ~ Term Processing System, which is to be embedded into Java applications.. JavaChecker – static analyzer of Java source code, based on TermWare technology.. JPE – is a partial evaluator for Java programs.참고: Term Rewriting All That PDF… Term Rewriting 개념을 먼저 이해할 필요가 있다. TermWare를 이 기술을 이용한 룰엔진겸 API이기 때문이다. 힌트를 얻을 수 있는 문헌들을 살펴본다.CORBA Service. UAKGQuery ~ CORBA service for database access.. HostProcControl – CORBA service, which represents OS remote control API.Web Server Extension for Apache utilizing CORBA applications. CASL – Cbroker Application Server Library. CASL represents extensive object model of classes, which has everything necessary to work out final server applications for Web, using ModCBroker.. ModCBroker -WWW front-end for CORBA application.GradC++Toolbox is a joined package composed by several platform-independet components designed to resolve standard widely-spread problem such as:- parsing of the command line;- writing debug and info messages;- starting and stopping of threads and so on.GradSoft는 우크라이나 Kiev 소재의 분산시스템 전문 기술회사이다. CORBA표준을 사용할 때 애로사항이었던 DB 질의와 웹서버 확장 문제를 해결할 수 있는 확장 모듈을 만들었으며, 수학적 기술에 기초한 룰엔진과 응용 툴을 개발하고 관련 기술을 서비스 하고 있다. 소스코드를 제공하는 조건으로 기술을 이전하는 것이 특징이다. CIS 연방 국가들에 저사양의 서버로 고성능을 필요로 하는 빌링시스템, 인터넷 사업자의 서비스 플랫폼으로 100여개 고객사를 가지고 있다. 북미와 유럽에서 웹서비스, EJB 같은 산업표준을 사용하여 고사양의 서버와 네트워크가 필요한 것과 달리 열악한 CIS 연방 국가들의 인프라 환경에 최적화 되며, 라이센스 비용을 최소화 할 수 있도록 CORBA 표준에 정의된 것보다 실용적인 서비스모듈, Apache 확장, 독자적인 룰엔진 기술들을 개발하여 활용하고 있다.Ruslan Schevchenko, Anatoliy DoroshenkoInstitute of Software Systems National Academy of Sciences of Ukraine… A new approach of building enterprise distributed applications for layer ofbusiness rules as standard part of architecture is proposed in this paper. The approachuses symbolic transformation system based on rewriting techniques and embedded inJava language and provides analysis and engineering distributed applications atsource code level. The benefit of the system is extreme flexibility of the approachand light-weightedness of formal methods and their separate application to programfeatures that does not need to know full semantic model of application programs. Thesystem is implemented and its usage is illustrated with an application example ofengineering CORBA middleware application.

혹시 JBoss의 Drools 쓰시는분 계신가요^^?

Reply to author

Sign in to reply to author

Forward

Sign in to forward

Delete

You do not have permission to delete messages in this group

Link

Report message as abuse

Sign in to report message as abuse

Show original message

Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message

Open Source Rule Engines in Java

SweetRules is a uniquely powerful integrated set of tools for semantic web rules and ontologies, revolving around the RuleML (Rule Markup/Modeling Language) emerging standard for semantic web rules, and supporting also the closely related SWRL (Semantic Web Rule Language), along with the OWL standard for semantic web ontologies, which in turn use XML and, optionally, RDF. (SWRL rules are essentially an expressive subset of RuleML rules.) SweetRules supports the powerful Situated Courteous Logic Programs extension of RuleML, including prioritized conflict handling and procedural attachments for actions and tests. SweetRules’ capabilities include semantics-preserving translation and interoperability between a variety of rule and ontology languages (including XSB Prolog, Jess production rules, HP Jena-2, and IBM CommonRules), highly scaleable backward and forward inferencing, and merging of rulebases/ontologies. Procedural attachments can even be WSDL Web Services. SweetRules’ pluggability and composition capabilities enable new components to be added relatively quickly. Implemented in Java, SweetRules has a compact codebase (~40K lines of code total for several dozen tools). The SweetRules project is an international, multi-institutional effort, originated and coordinated by the SweetRules group at MIT Sloan led by Benjamin Grosof, and its creation was funded largely by the DAML (DARPA Agent Markup Language) research program which co-pioneered the Semantic Web. SWEET (\”Semantic WEb Enabling Technology\”) is an overall set of tools that Benjamin Grosof’s group (with collaborators) has been developing since 2001. Other components in it include the SweetDeal e-contracting system approach and prototype, and the SweetPH system for business process ontologies drawn from the Process Handbook. Hundreds of users have already downloaded SweetRules, inspired in part by its well-received demonstrations in detailed presentations at the DAML Principal Investigators Meeting and the International Semantic Web Conference tutorial program.

키워드에 대한 정보 오픈 소스 룰 엔진

다음은 Bing에서 오픈 소스 룰 엔진 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 ThingsBoard CE 교육 : 레슨 5. 규칙 엔진

  • ThingsBoard
  • rule
  • node
  • IoT
  • IIoT
  • smart
  • device
  • education
  • lesson
  • free lessons

ThingsBoard #CE #교육 #: #레슨 #5. #규칙 #엔진


YouTube에서 오픈 소스 룰 엔진 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 ThingsBoard CE 교육 : 레슨 5. 규칙 엔진 | 오픈 소스 룰 엔진, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  여수 웅천 골드 클래스 | [생생주택] 34. 여수웅천 골드클래스 더 마리나 2탄! 하인엔드 럭셔리 모델하우스 세대 내부 공개! 차원이 다른 공간설계와 모던한 디자인의 혁신평면! 빠른 답변

Leave a Reply

Your email address will not be published. Required fields are marked *