Kogito,ergo规则:从知识到服务,轻松自如
歡迎閱讀有關Kogito倡議的博客系列的另一集,以及我們將Drools帶入云的努力。 這些文章的目的是收集用戶對我們提供給Kogito的功能的早期反饋。
在本文中,我們介紹了兩種實現完整智能服務的新方法 :
Kogito的執行單位
您可能已經知道,在Kogito中,我們正在使全新的Unit概念成為中心。
“執行單元”是我們用來表示可執行知識的術語。 一個單元可以是一個過程,一組規則,一個決策等。在一組規則的情況下,我們稱其為規則單元 。 如果您選擇使用單位,那么在Kogito中,我們將處理自動生成REST端點所需的所有樣板。
規則單元主要由
1)數據定義;
2)一組實現單元行為的規則和查詢(規則引擎的規則); 3)可選地,可以出于多種目的附加事件偵聽器。
在本文中,我們將重點介紹數據定義,規則和查詢。
通過聲明一個可能包含數據源的Java類來給出數據定義 。 每個數據源代表規則將匹配或插入到其中的工作內存分區。
例如,假設您要聲明一個警報服務,該服務接收事件并根據某些條件產生警報。 我們聲明
Event和Alert對象如下:
AlertingService單元類型聲明是實現接口RuleUnitData 。
package com.acme; public class AlertingService implements RuleUnitData { private final DataStream<Event> eventData = DataSource.createStream(); private final DataStream<Alert> alertData = DataSource.createStream(); // getters and setters }規則在DRL文件中照常定義,除了現在必須在文件頂部指示它們的單位 。 例如,您可以聲明AlertingService的數據定義,如下所示:
package com.acme; unit AlertingService; rule IncomingEvent when // matches when a temperature higher than 30 °C is registered (OOPath syntax) $e : /eventData [ type == "temperature" , value >= 30 ] then System.out.println( "incoming event: " + $e.getMessage()); alertData.append( new Alert( "warning" , "Temperature is too high" ) ); end如您所見,規則可能與給定的數據源匹配或插入到給定的數據源。
查詢是在DRL文件(如規則)中定義的,也屬于一個單元。 如果聲明至少一個查詢,則將免費獲得REST端點自動生成 。 例如:
query Warnings alerts: /alertData [ severity == "warning" ] end將生成REST端點/warnings ,您可以通過以下方式對其進行POST-ing調用:
$ curl -X POST \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "eventData": [ { "type": "temperature", "value" : 40 } ] }' \ http: //localhost:8080/warnings這將生成響應:
[ { "severity" : "warning" , "message" : "Temperature is too high" } ]程序員非常熟悉基于Java的數據定義,但是從用戶的早期反饋來看, 我們決定提供兩種替代方法來聲明規則單元 。 我們正在發布此博客文章,以收集更多的用戶反饋!
類型聲明
類型聲明是DRL功能,用于以與Java無關的方式聲明與Java兼容的類型。 在7系列中,用戶可以使用以下語法聲明類型:
package com.acme; declare Event type: String value: int end declare Alert severity: String message: String end這使DRL完全獨立:可以使用DRL定義實體和規則。 但是,它們沒有什么限制。 例如,它們不支持實現接口,也不支持泛型類型字段。 換句話說,以下聲明在7系列中在語法上是無效的:
package com.acme; declare AlertingService extends RuleUnitData eventData: DataStream<Event> alertData: DataStream<Alert> end在版本0.8.0中,我們解除了這些限制:我們允許接口的繼承受限(現在僅允許一個繼承),而字段的通用類型聲明。 使用這些新功能,以下代碼將成為有效的DRL。
長話短說: 您現在可以聲明完整的微服務
來自單個DRL 。
用原型引導您的Kogito服務:
mvn archetype:generate \ -DarchetypeGroupId=org.kie.kogito \ -DarchetypeArtifactId=kogito-quarkus-archetype \ -DarchetypeVersion= 0.8 . 0 \ -DgroupId=com.acme \ -DartifactId=sample-kogito目前,還沒有Quarkus版本捆綁Kogito 0.8.0。 否則,您將可以使用mvn io.quarkus:quarkus-maven-plugin:create代替。
現在,清除src/main的內容,然后將此DRL放到src/main/resources/com/acme文件夾中:
package com.acme; unit AlertingService; import org.kie.kogito.rules.DataStream; import org.kie.kogito.rules.RuleUnitData; declare Event type: String value: int end declare Alert severity: String message: String end declare AlertingService extends RuleUnitData eventData: DataStream<Event> alertData: DataStream<Alert> end rule IncomingEvent when // matches when a temperature higher than 30 °C is registered (OOPath syntax) $e : /eventData [ type == "temperature" , value >= 30 ] then System.out.println( "incoming event: " + $e.getMessage()); alertData.append( new Alert( "warning" , "Temperature is too high: " + $e ) ); end query Warnings alerts: /alertData [ severity == "warning" ] end現在,通過以下方式在開發人員模式下啟動Quarkus服務:
$ mvn compile quarkus:dev到此為止,您現在可以curl您的服務了:
$ curl -X POST \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "eventData": [ { "type": "temperature", "value" : 40 } ] }' \ http: //localhost:8080/warnings工作流程整合
公開基于規則的服務的另一種方法是通過工作流 。
工作流 (有時稱為“業務流程”)描述了圖中的一系列步驟,并且通常聲明變量 :在執行過程中操作的值的數據持有者。 一個這樣的變量的數據類型可以是任何東西 :您可以使用Java類,但是在此示例中,我們將再次使用聲明的數據類型。
package com.acme; declare Event type: String value: int end declare Alert severity: String message: String end讓我們將此工作流稱為com.acme.AlertingWorkflow ,并聲明變量eventData和alertData :
包含規則任務的工作流可能會完全跳過規則單元的數據聲明 :在這種情況下,規則單元是直接從流程的結構中推斷出的:每個變量都將插入同名的數據源中 。
單元的名稱由進程使用語法unit:com.acme.AlertingService 。 您仍然可以自由聲明單元com.acme.AlertingService ; 在這種情況下,該過程將獲取您手工編碼的聲明。
注意:您可能已經注意到我們正在使用“規則流組”字段。 將來,我們將在UI中實現更明確的支持。
用原型引導您的Kogito服務:
mvn archetype:generate \ -DarchetypeGroupId=org.kie.kogito \ -DarchetypeArtifactId=kogito-quarkus-archetype \ -DarchetypeVersion= 0.8 . 0 \ -DgroupId=com.acme \ -DartifactId=sample-kogito警告 。 該功能的支持是試驗性的,因此它可能無法與Quarkus熱代碼重新加載無縫配合; 我們還需要執行以下額外步驟來啟用它,但將來會有所改變。
使用以下插件聲明更新pom.xml :
<build> <plugins> <plugin> <groupId>org.kie.kogito</groupId> <artifactId>kogito-maven-plugin</artifactId> <version> 0.8 . 0 </version> <executions> <execution> <goals> <goal>generateDeclaredTypes</goal> </goals> </execution> </executions> </plugin> ... </plugins> </build>現在,您可以清除src/main的內容,然后將進程和以下DRL放到src/main/resources/com/acme文件夾中。
package com.acme; unit AlertingService; import org.kie.kogito.rules.DataStream; import org.kie.kogito.rules.RuleUnitData; declare Event type: String value: int end declare Alert severity: String message: String end rule IncomingEvent when // matches when a temperature higher than 30 °C is registered (OOPath syntax) $e : /eventData [ type == "temperature" , value >= 30 ] then System.out.println( "incoming event: " + $e.getMessage()); alertData.set( new Alert( "warning" , "Temperature is too high: " + $e ) ); end您可能已經注意到,不需要顯式聲明查詢:該過程將顯示變量的內容作為響應; 它將生成端點/AlertingWorkflow ,并接受以下形式的POST請求:
$ curl -X POST \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "eventData": { "type": "temperature", "value" : 40 } }' \ http: //localhost:8080/AlertingWorkflow答復將是:
{ "id" : ..., "eventData" : { "type" : "temperature" , "value" : 100 }, "alertData" : { "severity" : "warning" , "message" : "Temperature is too high: Event( type=temperature, value=100 )" } }但是,如果您確實聲明了查詢,那么還將有一個單獨的端點。 例如,如果您聲明查詢“ Warnings您仍然可以POST到http://localhost:8080/warnings并分別調用規則服務,如下所示:
$ curl -X POST \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "eventData": { "type": "temperature", "value" : 40 } }' \ http: //localhost:8080/warnings請注意,該請求不再包含事件列表。 這是因為過程變量映射到單個值而不是DataStreams。
結論
我們偷看了我們正在做的工作,以改進Kogito中的規則和流程的入門經驗。 通過這些更改,我們希望提供一種更加簡化的方法來定義基于知識的服務。 通過選擇編寫Java,開發人員將始終能夠更加明確地了解他們想要處理的數據。 但是如果他們愿意,他們可以采用完全以DSL為中心的開發工作流程。
對于懶惰者,可以在https://github.com/evacchi/kogito-rules-example/tree/master/code獲得示例。
翻譯自: https://www.javacodegeeks.com/2020/03/kogito-ergo-rules-from-knowledge-to-service-effortless.html
總結
以上是生活随笔為你收集整理的Kogito,ergo规则:从知识到服务,轻松自如的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是收敛函数 收敛函数的名词解释
- 下一篇: ejb生命周期_EJB 3.x:生命周期