Kogitoとは何か

Kogitoはクラウドネイティブなビジネスオートメーションツールキットで、あなたの生活をより簡単にするために存在します。ビジネスプロセスマネジメント(BPM)と意思決定管理のクラウドで育った愛の結晶と考えてください。その親はQuarkusです。

しかし、なぜ経験豊富な開発者であるあなたがKogitoに注目すべきなのでしょうか?ここにその要点があります:

  • クラウドネイティブで、Kubernetesにすぐに対応
  • Quarkusと相性が良く、超音速でサブアトミックなJavaの力を提供
  • ビジネスプロセスと意思決定をコードベースの一級市民に変換
  • オープンソースで、Apache Software Foundationに支援されています(現在インキュベーション中)

Kogito Examplesリポジトリを探る

興味を引かれたところで、apache/incubator-kie-kogito-examplesリポジトリを見てみましょう。この宝の山の例は、Kogitoをマスターするためのチケットです。

Kogitoプレイグラウンドのセットアップ

始める前に、これらの例を実行するために必要なものを確認しましょう:

  • Java 11以上(私たちは野蛮人ではありません)
  • Maven 3.8.1以上
  • Docker(コンテナ化の欲求を満たすために)
  • Quarkus CLI(オプションですが、生産性を向上させるために強く推奨)

すべて揃いましたか?素晴らしい!では、実際に手を動かしてみましょう。

Quarkus: Kogitoの相棒

「Quarkusは何をしてくれるの?」と思うかもしれませんが、実はすべてです。QuarkusはKogitoにクラウドネイティブな超能力を与える超音速でサブアトミックなJavaフレームワークです。Javaアプリケーションにとってのレッドブルのようなものですが、カフェインの震えはありません。

KogitoはQuarkusを活用して:

  • 驚異的な速さでの起動時間を実現
  • メモリ使用量を削減(財布が喜びます)
  • ホットリロード機能を提供(再起動の時間は誰にもありません)
  • クラウドネイティブ技術とのシームレスな統合を提供

Kogito Examplesを探る:一気に見てみよう

リポジトリの中で最も興味深い例を見てみましょう:

1. プロセス + ルール: ダイナミックデュオ

kogito-quarkus-examples/process-business-rules-quarkusディレクトリに移動します。この例は、Kogitoがプロセスとルールを組み合わせて強力な意思決定エンジンを作成する方法を示しています。

主なポイント:

  • BPMN2プロセスとDMN意思決定テーブルの統合
  • プロセスのための自動RESTエンドポイント生成
  • プロセスコンテキスト内でのシームレスなルール実行

2. サーバーレスワークフロー: サーバーはもう古い

serverless-workflow-examples/serverless-workflow-greeting-quarkusの例をチェックしてください。これはサーバーレス愛好家のためのものです。

ハイライト:

  • YAMLで定義されたワークフロー(YAMLが好きな人にはたまりません)
  • イベント駆動型アーキテクチャの簡単な実装
  • AWS LambdaとKnativeとの統合

3. DMN: 意思決定を再び素晴らしく

kogito-quarkus-examples/dmn-quarkus-exampleに移動して、Kogitoでの意思決定モデルと表記(DMN)を深く掘り下げてみましょう。

学べること:

  • 複雑な意思決定ロジックの視覚的なモデリング
  • 意思決定サービスのための自動REST API生成
  • プロのようにDMNモデルをテストおよびデバッグ

最初のKogito例を実行する:ステップバイステップガイド

理論は十分です。実際に手を動かしてみましょう!process-business-rules-quarkusの例を使って始めましょう。

実行中にAPIをテストします:

curl -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{"person": {"name":"John Doe", "age": 25}}' http://localhost:8080/persons

例をビルドして実行します:

./mvnw clean compile quarkus:dev

リポジトリをクローンします:

git clone https://github.com/apache/incubator-kie-kogito-examples.git
cd incubator-kie-kogito-examples/kogito-quarkus-examples/process-business-rules-quarkus

Voilà!Kogitoを使って埋め込まれたルールでビジネスプロセスを実行しました。その力を感じますか?

ビジネスプロセスの実装:BPMNとDMN、なんてこった!

KogitoはBPMN(ビジネスプロセスモデルと表記)とDMN(意思決定モデルと表記)を21世紀に持ち込みます。重くて扱いにくいBPMエンジンの時代は終わりました。Kogitoを使えば、プロセスと意思決定はコードベースの一級市民です。

BPMN: 強化されたフローチャート

シンプルなBPMNプロセスを見てみましょう:

<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" id="_6063f3a1-5ba3-4f0e-b1f2-ad49e8e6f2a7" targetNamespace="http://www.omg.org/bpmn20">
  <bpmn2:process id="greeting" name="Greeting Process" isExecutable="true">
    <bpmn2:startEvent id="_1" name="StartProcess">
      <bpmn2:outgoing>_1-_2</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:scriptTask id="_2" name="Hello" scriptFormat="http://www.java.com/java">
      <bpmn2:incoming>_1-_2</bpmn2:incoming>
      <bpmn2:outgoing>_2-_3</bpmn2:outgoing>
      <bpmn2:script>System.out.println("Hello World");</bpmn2:script>
    </bpmn2:scriptTask>
    <bpmn2:endEvent id="_3" name="EndProcess">
      <bpmn2:incoming>_2-_3</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="_1-_2" sourceRef="_1" targetRef="_2"/>
    <bpmn2:sequenceFlow id="_2-_3" sourceRef="_2" targetRef="_3"/>
  </bpmn2:process>
</bpmn2:definitions>

このシンプルなプロセスは「Hello World」を出力するだけですが、ビジネスロジックや外部システムと統合する可能性を想像してみてください!

DMN: 意思決定、意思決定

次に、DMNモデルを見てみましょう:

<?xml version="1.0" encoding="UTF-8"?>
<dmn:definitions xmlns:dmn="http://www.omg.org/spec/DMN/20180521/MODEL/" xmlns="https://kiegroup.org/dmn/_52CEF9FD-9943-4A89-96D5-6F66810CA4C1" xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/" xmlns:kie="http://www.drools.org/kie/dmn/1.2" xmlns:dmndi="http://www.omg.org/spec/DMN/20180521/DMNDI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/" id="_4F7C97F9-EA35-4CB5-8E4C-C40C91B5F729" name="Greeting" typeLanguage="http://www.omg.org/spec/DMN/20180521/FEEL/" namespace="https://kiegroup.org/dmn/_52CEF9FD-9943-4A89-96D5-6F66810CA4C1">
  <dmn:decision id="_23B84E59-33C6-4D3A-9314-CF0724714606" name="Greeting Message">
    <dmn:extensionElements/>
    <dmn:variable id="_078A6F79-1861-47A1-8921-C9E7F2B728D1" name="Greeting Message" typeRef="string"/>
    <dmn:informationRequirement id="_2066A270-2A88-4B77-9F90-1F683FDF852C">
      <dmn:requiredInput href="#_C7ED7EFC-9F7F-4FBE-81DB-57A32A56502C"/>
    </dmn:informationRequirement>
    <dmn:decisionTable id="_5A25D948-34E0-4527-9EE2-7A9C0DC663A5" hitPolicy="UNIQUE" preferredOrientation="Rule-as-Row">
      <dmn:input id="_79ECD1F2-E11E-4F6D-9038-C47AE6EC1C9C">
        <dmn:inputExpression id="_E17A0C1D-A0F0-4C5F-8A0E-8B5F9A1BAB08" typeRef="number">
          <dmn:text>Age</dmn:text>
        </dmn:inputExpression>
      </dmn:input>
      <dmn:output id="_EC6A4902-BD03-4D48-AA45-9AD2AEB83E8B"/>
      <dmn:annotation name="annotation-1"/>
      <dmn:rule id="_C3F28427-2608-4ACE-98EE-C5C2F0AEF7A7">
        <dmn:inputEntry id="_0FBE3F3C-5F3A-4A21-A4A5-D207B2BA7808">
          <dmn:text>< 18</dmn:text>
        </dmn:inputEntry>
        <dmn:outputEntry id="_C05BE7BB-BDA0-4C45-9ED1-4F5B17B2A3E6">
          <dmn:text>"Hello young person!"</dmn:text>
        </dmn:outputEntry>
        <dmn:annotationEntry>
          <dmn:text/>
        </dmn:annotationEntry>
      </dmn:rule>
      <dmn:rule id="_C3B07D74-0354-4C44-9587-9B44C67F5AE0">
        <dmn:inputEntry id="_8A9B0EEC-5CB9-4D31-BB56-0A723CEABFBC">
          <dmn:text>>= 18</dmn:text>
        </dmn:inputEntry>
        <dmn:outputEntry id="_42C4EB7F-3F00-4A19-9F43-D2E246F378F9">
          <dmn:text>"Hello adult!"</dmn:text>
        </dmn:outputEntry>
        <dmn:annotationEntry>
          <dmn:text/>
        </dmn:annotationEntry>
      </dmn:rule>
    </dmn:decisionTable>
  </dmn:decision>
  <dmn:inputData id="_C7ED7EFC-9F7F-4FBE-81DB-57A32A56502C" name="Age">
    <dmn:extensionElements/>
    <dmn:variable id="_F0B70F13-94CB-4FB9-BD89-4AB84F8BDB07" name="Age" typeRef="number"/>
  </dmn:inputData>
  <dmndi:DMNDI>
    <dmndi:DMNDiagram>
      <di:extension>
        <kie:ComponentsWidthsExtension>
          <kie:ComponentWidths dmnElementRef="_5A25D948-34E0-4527-9EE2-7A9C0DC663A5">
            <kie:width>50</kie:width>
            <kie:width>100</kie:width>
            <kie:width>100</kie:width>
            <kie:width>100</kie:width>
          </kie:ComponentWidths>
        </kie:ComponentsWidthsExtension>
      </di:extension>
      <dmndi:DMNShape id="dmnshape-_23B84E59-33C6-4D3A-9314-CF0724714606" dmnElementRef="_23B84E59-33C6-4D3A-9314-CF0724714606" isCollapsed="false">
        <dmndi:DMNStyle>
          <dmndi:FillColor red="255" green="255" blue="255"/>
          <dmndi:StrokeColor red="0" green="0" blue="0"/>
          <dmndi:FontColor red="0" green="0" blue="0"/>
        </dmndi:DMNStyle>
        <dc:Bounds x="364" y="227" width="100" height="50"/>
        <dmndi:DMNLabel/>
      </dmndi:DMNShape>
      <dmndi:DMNShape id="dmnshape-_C7ED7EFC-9F7F-4FBE-81DB-57A32A56502C" dmnElementRef="_C7ED7EFC-9F7F-4FBE-81DB-57A32A56502C" isCollapsed="false">
        <dmndi:DMNStyle>
          <dmndi:FillColor red="255" green="255" blue="255"/>
          <dmndi:StrokeColor red="0" green="0" blue="0"/>
          <dmndi:FontColor red="0" green="0" blue="0"/>
        </dmndi:DMNStyle>
        <dc:Bounds x="365" y="94" width="100" height="50"/>
        <dmndi:DMNLabel/>
      </dmndi:DMNShape>
      <dmndi:DMNEdge id="dmnedge-_2066A270-2A88-4B77-9F90-1F683FDF852C" dmnElementRef="_2066A270-2A88-4B77-9F90-1F683FDF852C">
        <di:waypoint x="415" y="119"/>
        <di:waypoint x="414" y="252"/>
      </dmndi:DMNEdge>
    </dmndi:DMNDiagram>
  </dmndi:DMNDI>
</dmn:definitions>

このDMNモデルは、年齢に基づいて挨拶を決定します。シンプルな例ですが、これを複雑なビジネスルールや意思決定プロセスに拡張することを想像してみてください!

ルールと意思決定のカスタマイズ:あなたの方法で

Kogitoは、既製のルールや意思決定を提供するだけでなく、あなたのビジネスニーズに合わせてカスタマイズすることができます。ここでは、カスタマイズの方法をいくつか紹介します:

1. Droolsルール言語(DRL)

ビジュアルモデルでは不十分な場合、古き良きDRLを使用できます:

package org.acme.rules

import org.acme.model.Person

rule "Greet adults"
when
    $person: Person(age >= 18)
then
    System.out.println("Hello, responsible adult!");
end

rule "Greet children"
when
    $person: Person(age < 18)
then
    System.out.println("Hi, youngster! Where are your parents?");
end

2. 決定テーブル

コードを見ると蕁麻疹が出るビジネスユーザーにとって、決定テーブルは神の恵みです:

RuleSet,org.acme.rules
RuleSetName,Greeting Rules

RuleTable Greeting
CONDITION,ACTION
Person.age,System.out.println
>=18,"Hello, responsible adult!"
<18,"Hi, youngster! Where are your parents?"

3. カスタム関数でDMNを拡張

DMNモデルにさらなる力を加えたい場合、カスタムJava関数で拡張できます:

@DMNFunction(name = "toUpperCase")
public static String toUpperCase(String input) {
    return input.toUpperCase();
}

これで、DMN式でtoUpperCase()を使用できます。すごいですね?

Kogitoを外部世界と統合する

Kogitoは他のシステムともうまく連携します。いくつかの人気のある外部システムとの統合方法を見てみましょう:

REST API: SOAPは洗うためのもの

Kogitoはプロセスと意思決定のためのRESTエンドポイントを自動生成します。しかし、外部のREST APIを呼び出す必要がある場合はどうしますか?簡単です:

@Inject
RestClient myExternalService;

@POST
@Path("/process")
public Response startProcess(ProcessPayload payload) {
    // Kogitoプロセスを開始
    ProcessInstance<?> processInstance = processService.createProcessInstance(...);
    
    // 外部REST APIを呼び出す
    ExternalData data = myExternalService.getData(payload.getId());
    
    // プロセス変数を更新
    processInstance.updateVariables(Collections.singletonMap("externalData", data));
    
    return Response.ok(processInstance).build();
}

Kafka: イベント駆動の瞬間のために

KogitoとKafkaはピーナッツバターとジャムのように相性が良いです。少し味見してみましょう:

@Inject
Emitter<PersonEvent> personEventEmitter;

@POST
@Path("/persons")
public Response createPerson(Person person) {
    // Kogitoプロセスロジック
    
    // Kafkaにイベントを送信
    personEventEmitter.send(new PersonEvent(person));
    
    return Response.ok(person).build();
}

application.propertiesでKafka接続を設定するのを忘れないでください:

mp.messaging.outgoing.person-events.connector=smallrye-kafka
mp.messaging.outgoing.person-events.topic=person-events
mp.messaging.outgoing.person-events.value.serializer=io.quarkus.kafka.client.serialization.JsonbSerializer

Kogitoのデバッグ:問題が発生したとき

最高の開発者でもデバッグのピンチに陥ることがあります。ここでは、あなたの精神を保つためのいくつかのヒントを紹介します:

1. デバッグログを有効にする

まず最初に、ログを強化しましょう:

quarkus.log.category."org.kie".level=DEBUG
quarkus.log.category."org.drools".level=DEBUG
quarkus.log.category."org.jbpm".level=DEBUG

2. Kogito Dev UIを使用する

Kogitoには洗練されたDev UIがあります。この依存関係を追加するだけです:

<dependency>
    <groupId>org.kie.kogito</groupId>
    <artifactId>kogito-addons-quarkus-process-management</artifactId>
</dependency>

これでhttp://localhost:8080/q/devにアクセスして、プロセスと意思決定を実際に見ることができます。

3. テスト、テスト、テスト

ユニットテストはあなたの友達です。ここに簡単な例があります:

@QuarkusTest
public class GreetingProcessTest {

    @Inject
    ProcessService processService;

    @Test
    public void testGreetingProcess() {
        ProcessInstance<?> processInstance = processService.createProcessInstance(
            "greeting",
            Collections.singletonMap("name", "John")
        );
        
        assertThat(processInstance.status()).isEqualTo(ProcessInstance.STATE_COMPLETED);
        assertThat(processInstance.variables()).containsEntry("greeting", "Hello, John!");
    }
}

パフォーマンスチューニング:もっと速く

Kogitoは速いですが、これらのヒントを使えば音速を超えることができます:

1. ネイティブコンパイル

Quarkusはネイティブコンパイルを提供し、起動時間とメモリ使用量を大幅に削減できます:

./mvnw package -Pnative

2. リアクティブプログラミング

スケーラビリティを向上させるためにリアクティブパラダイムを採用しましょう:

@Inject
ReactiveProcessService processService;

@POST
@Path("/process")
public Uni<ProcessInstance<?>> startProcess(ProcessPayload payload) {
    return processService.createProcessInstance("myProcess", payload.toMap());
}

3. キャッシング

Quarkusの組み込みキャッシング機能を使用して頻繁な操作を高速化しましょう:

@CacheResult(cacheName = "greeting-cache")
public String getGreeting(String name) {
    // 高価な操作
    return "Hello, " + name + "!";
}

ベストプラクティス:やるべきこととやってはいけないこと

Kogito開発のための黄金律をいくつか紹介します:

やるべきこと:

  • プロセスと意思決定をシンプルでモジュール化されたものに保つ
  • BPMNとDMN要素に意味のある名前を付ける
  • Quarkusのホットリロードを活用して迅速な開発を行う
  • プロセスと意思決定を文書化する(未来の自分が感謝します)
  • BPMNとDMNファイルのバージョン管理を行う

やってはいけないこと:

  • プロセス図にビジネスロジックを入れる(代わりにサービスタスクを使用)
  • プロセスでのエラーハンドリングを怠る
  • 監視と可観測性を無視する
  • セキュリティのベストプラクティスを無視する(Kogitoは魔法のセキュリティ粉ではありません)

実世界のKogito:ただの見た目ではない

Kogitoはおもちゃの例だけではありません。実際のビジネスオートメーションで使用されています。いくつかの実際のアプリケーションを紹介します:

  • 金融サービス:ローン承認プロセスと不正検出の自動化
  • ヘルスケア:患者のワークフローと保険請求処理の管理
  • 電子商取引:注文履行と返品プロセスのオーケストレーション
  • 製造業:サプライチェーンの意思決定と品質管理プロセスの最適化

Kogitoへの貢献:クールな仲間に加わろう

インスピレーションを感じましたか?コミュニティに貢献したいですか?Kogitoに貢献する方法を紹介します:

  1. Kogito Examplesリポジトリをフォークする
  2. 問題トラッカーから問題を選ぶ
  3. 変更を加えてプルリクエストを送信する
  4. メーリングリストでコミュニティと交流する

どんな貢献も小さすぎることはありません。ドキュメントの誤字を修正するだけでも感謝されます!

最終カウントダウン:まとめ

以上で、Kogitoとその超能力の一気に駆け抜けるツアーが終了です。最初のKogitoプロジェクトのセットアップからオープンソースコミュニティへの貢献まで、すべてをカバーしました。

Quarkusによって強化されたKogitoは、ビジネスオートメーションのゲームを変えています。クラウドネイティブ技術の力をビジネスプロセスと意思決定の世界にもたらします。シンプルなワークフローから複雑な意思決定システムまで、Kogitoはあなたをサポートします。

さあ、何を待っているのでしょうか?飛び込んで、実験を始め、Kogito革命に参加しましょう。未来の自分(と運用チーム)が感謝するでしょう。

覚えておいてください:大きな力には大きな責任が伴います。Kogitoを賢く使い、ビジネスプロセスが常にあなたの味方でありますように!