日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kogito,ergo规则:从知识到服务,轻松自如

發布時間:2023/12/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kogito,ergo规则:从知识到服务,轻松自如 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歡迎閱讀有關Kogito倡議的博客系列的另一集,以及我們將Drools帶入云的努力。 這些文章的目的是收集用戶對我們提供給Kogito的功能的早期反饋。

在本文中,我們介紹了兩種實現完整智能服務的新方法 :

  • 獨立的規則服務
  • 集成智能工作流程和規則任務
  • Kogito的執行單位

    您可能已經知道,在Kogito中,我們正在使全新的Unit概念成為中心。

    “執行單元”是我們用來表示可執行知識的術語。 一個單元可以是一個過程,一組規則,一個決策等。在一組規則的情況下,我們稱其為規則單元 。 如果您選擇使用單位,那么在Kogito中,我們將處理自動生成REST端點所需的所有樣板。

    規則單元主要由

    1)數據定義;

    2)一組實現單元行為的規則和查詢(規則引擎的規則); 3)可選地,可以出于多種目的附加事件偵聽器。

    在本文中,我們將重點介紹數據定義,規則和查詢。

    通過聲明一個可能包含數據源的Java類來給出數據定義 。 每個數據源代表規則將匹配或插入到其中的工作內存分區。

    例如,假設您要聲明一個警報服務,該服務接收事件并根據某些條件產生警報。 我們聲明
    Event和Alert對象如下:

    package com.acme; public class Event { String type; int value; // getters and setters } public class Alert { String severity; String message; // getters and setters }

    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规则:从知识到服务,轻松自如的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。