Droolsブログ : 10 Business Central

10 Business Central

Drools には Business Central という強力な Web UI ツールが付いています。以下、機能を列挙しますと

  • ルール、デシジョンテーブル、データオブジェクト、プロセスなど、ファイルの管理
  • プロジェクトの管理
  • ルール、デシジョンテーブル、データオブジェクト、プロセスなどのエディター
  • テストシナリオの作成、実行
  • プロジェクトから kjar をビルド、kie-server(後日解説)へのデプロイ
  • kie-server インスタンスの管理
  • ロールベースのアクセス制限
  • プロセス、タスクの実行(jBPM)
  • プロセスインスタンスの監視(jBPM)

などなど。

ファイルは Git でバージョン管理されており、他の Git クライアントとの連携ももちろん出来ます。

ちなみに Workbench, Decision Central などの呼び名もありますが、「Business Central」で統一する方向のようです。

では使ってみましょう。

こちらのリンクの「Business Central Workbench」から「WildFly 14 WAR」をダウンロードします。

https://www.drools.org/download/download.html

WildFly 本体はこちらからダウンロードします。(EAP でも OK です)

https://wildfly.org/downloads/

最新の WildFly 18.0.1.Final でも動作しましたが、ちょっとエラーが出るようです。今回は 14.0.1.Final でやります。「14.0.1.Final」の「Java EE Full & Web Distribution」をダウンロードします。

wildfly-14.0.1.Final.zip を解凍したら wildfly-14.0.1.Final/standalone/deployments の下に先ほどダウンロードした business-central-7.32.0.Final-wildfly14.war コピーします。

wildfly-14.0.1.Final/bin に移動し、add-user.sh でユーザを作成します (Windows の人は適宜 bat に読み替えて下さい) b) Application User の方です。ユーザ名は何でも構いません。ロールは admin,kie-server,rest-all を与えます。

$ ./add-user.sh 

What type of user do you wish to add? 
 a) Management User (mgmt-users.properties) 
 b) Application User (application-users.properties)
(a): b

Enter the details of the new user to add.
Using realm 'ApplicationRealm' as discovered from the existing property files.
Username : rhdmAdmin
...
Password : 
Re-enter Password : 
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[  ]: admin,kie-server,rest-all
About to add user 'rhdmAdmin' for realm 'ApplicationRealm'
Is this correct yes/no? yes
...
yes/no? yes
...

また WildFly デフォルトの -Xmx と -XX:MaxMetaspaceSize は少ないのでそれぞれ 2G くらいに増やしておきます。

bin/standalone.conf

   JAVA_OPTS="-Xms64m -Xmx2g -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=2g -Djava.net.preferIPv4Stack=true"

では WildFly を起動します。

$ ./standalone.sh

デプロイには少々時間がかかります。。。

...
16:36:52,739 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 42) WFLYSRV0010: Deployed "business-central-7.32.0.Final-wildfly14.war" (runtime-name : "business-central-7.32.0.Final-wildfly14.war")

以下の URL でアクセスします。

http://localhost:8080/business-central-7.32.0.Final-wildfly14

先ほど作ったユーザでログインします。 f:id:tokobayashi:20200207155133p:plain

まず最初に日本語UIに変更しておきましょう。右上の歯車アイコンをクリックし、Settings メニューから「Languages」をクリック、セレクトボックスから「Japanese」を選んで OK をクリックしてください。 f:id:tokobayashi:20200207155153p:plain

日本語になりましたね!

ではプロジェクトを作っていきましょう。 [メニュー]->[プロジェクト] をクリックすると「スペース」という画面になります。スペースというのは複数のプロジェクトをまとめる単位です。デフォルトで「MySpace」というスペースがあるのでそれを使います。「MySpace」をクリックすると。。。 f:id:tokobayashi:20200207155210p:plain

どーんと「ここには何もありません」と表示されますね。「プロジェクトの追加」からプロジェクトを作成します。ちなみに「サンプルを試す」で様々なサンプルを見ることができます。ルール関連だと「Mortgages」サンプルがおすすめです。

「プロジェクトの追加」をクリックするとポップアップが出るのでプロジェクト名を決めます。ここでは helloProject とします。プロジェクトが作成されてもまだ空っぽなので「ここには何もありません」と表示されています。

データオブジェクト(= POJO)を作ってみましょう。「アセットの追加」をクリックします。様々なアセットを作成できます。「データオブジェクト」をクリックするとポップアップが出ます。データオブジェクト名を Person 、パッケージを com.myspace.helloproject とし、OK をクリックします。 データオブジェクトを作ってみましょう。「アセットの追加」をクリックします。様々なアセットを作成できます。「データオブジェクト」をクリックするとポップアップが出ます。データオブジェクト名を Person 、パッケージを com.myspace.helloproject とし、OK をクリックします。

この画面でデータオブジェクトのフィールドを追加できます。「フィールドを追加」から

  • name を String
  • age を int
  • adult を boolean

。。。 と追加していきます。最後に「保存」を忘れずに!

「ソース」タブをクリックすればわかるように、これは単純に Java ソースを作ってくれるものです。この画面でデータオブジェクトを作成する以外にも、別途必要なクラスを持った jar ファイルを dependency に設定することでそのクラスをルールで使えます。 f:id:tokobayashi:20200207155236p:plain

続いてルールを書きます。

「アセットの追加」(プロジェクトが空っぽじゃないときは右上にボタンがあるよ!)をクリックして「ガイド付きルール」を選択します。ルール名は helloPerson 、パッケージは com.myspace.helloproject とします。「ガイド付きルール」というのは GUI でルールを書くというものです。右端の方にあるプラスアイコンをクリックして WHEN や THEN の中身を追加していきます。まず WHEN のプラスアイコンをクリック、「条件をルールに追加...」から「Person」を選択します。するとルールに「Person があります」という文が追加されます。そこから詳細を設定していきます。

  • 「Person があります」をクリック、「フィールドに制限を追加」 -> age を選択
  • age の右のセレクトボックスから「は次の値よりも大きい」を選択
  • その右のえんぴつアイコンをクリック -> 「固定値」をクリック
  • テキストボックスに 20 を入力
  • 「Person があります」をクリック、「変数名」のテキストボックスに $p を入力し「設定」をクリック

続いて THEN のプラスアイコンをクリック、「$p のフィールド値を変更」を選択、「Person [$p] の値 設定」という文が追加されるのでそれをクリックし、セレクトボックスから adult を追加し、値に true を選択します。最後に「保存」。 f:id:tokobayashi:20200207155252p:plain

「ソース」タブを見ればわかるように、これは DRL を作成してくれます。

続いてテストシナリオを書きます。「アセットの追加」->「テストシナリオ」、名前は testscenario1 、パッケージは com.myspace.helloproject とします。

  • 「GIVEN」列の「INSTANCE1」をクリック、右の「テストツール」パネルから「Person」を選択、「Insert Data Object」をクリック
  • すると「INSTANCE1」が「Person」に変化します。次はその下のセルをクリックし、「テストツール」パネルから name を選択、「Insert Data Object」をクリック
  • するとそのセルが「name」に変化。そのセルを右クリックし、「右に列を挿入」を選択
  • すると右にセルが増えるので、同様に「テストツール」パネルから age を選択、「Insert Data Object」をクリック
  • 「EXPECT」列も同様に INSTANCE を「Person」に、PROPERTY は「adult」を指定(列は増やさない)
  • 1行目は name「太郎」、age「35」、adult「true」で、値を入力
  • 右クリック「行を下に挿入」で行を増やせるので2行目は name「次郎」、age「18」、adult「false」にする
  • 保存
  • メニュー中央の三角(再生)ボタンをクリック!右側に結果が出ます。テストシナリオでルールが正しく動いていることを検証できました。

f:id:tokobayashi:20200207155308p:plain

Business Central の機能はまだまだたくさんありますが、今回はここまで!

kogito-operator / kogito CLI 備忘録

https://github.com/kiegroup/kogito-cloud-operator#kogito-cli

Setup OpenShift 4 UPI

Login as kubeadmin (password は quicklab の OpenShift Credentials から)

-> Operators -> OperatorHub -> Search with kogito

Install kogito-operator to a project (e.g. 'default')

oc login --token=... (Command Line Tools)

Download kogito CLI via https://github.com/kiegroup/kogito-cloud-operator/releases

-> Unzip

confirm oc version, kogito version

oc version

kogito --version

サービス作成

kogito use-project default

kogito deploy-service example-quarkus https://github.com/kiegroup/kogito-examples/ --context-dir=drools-quarkus-example
KogitoApp 'example-quarkus' successfully created on namespace 'default'
You can see the deployment status by using 'oc describe kogitoapp example-quarkus -n default'
Your Kogito Runtime Service should be deploying. To see its logs, run 'oc logs -f bc/example-quarkus-builder -n default'

アプリテスト

URL は Routes で確認

curl -X GET http://example-quarkus-default.apps.tkobayas01.lab.pnq2.cee.redhat.com/candrink/john/35

native build

kogito deploy-service example-quarkus https://github.com/kiegroup/kogito-examples/ --context-dir=drools-quarkus-example --native

サービス削除

kogito delete-service example-quarkus

Quarkus 備忘録

  • quarkus:dev で jvmArgs
      <plugin>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>build</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <jvmArgs>-XX:+UnlockExperimentalVMOptions -XX:hashCode=0</jvmArgs>
        </configuration>
      </plugin>
  • suspend して debugger 待ち
mvn clean compile quarkus:dev -DskipTests -Dsuspend=true
  • container で native build も簡単
./mvnw package -Pnative -Dquarkus.native.container-build=true
  • できている native image に対してテスト
./mvnw test-compile failsafe:integration-test

Logging

quarkus.log.level=INFO
quarkus.log.category."org.hibernate".level=DEBUG

quarkus-maven-plugin

  • GenerateCodeMojo (mvn debug 18787) QuarkusBootstrap -> CuratedApplication -> QuarkusClassLoader

    CodeGenerator -> List = []

  • DevMojo (mvn debug 18787)

    DevModeRunner

    debug port

    DevModeRunner.run() -> java.lang.ProcessBuilder -> java.lang.ProcessImpl.start()

    DevMojo.execute() loop : check pom.xml changes

live reload (hot swap)

  • RuntimeUpdatesProcessor (quarkus 5005)

    VertxHttpHotReplacementSetup -> RuntimeUpdatesProcessor.doScan() -> restart = true ->

                    if (restart) {
                        routingContext.request().headers().set(HEADER_NAME, "true");
                        VertxHttpRecorder.getRootHandler().handle(routingContext.request());
                    }
RuntimeUpdatesProcessor.doScan(boolean) line: 185    
VertxHttpHotReplacementSetup$2.handle(Promise<Boolean>) line: 61  
VertxHttpHotReplacementSetup$2.handle(Object) line: 51  
EventLoopContext(ContextImpl).lambda$executeBlocking$2(PoolMetrics, Object, Handler, Handler) line: 313 
247875749.run() line: not available 
ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1128  
ThreadPoolExecutor$Worker.run() line: 628   
FastThreadLocalRunnable.run() line: 30  
VertxThread(Thread).run() line: 834 

Jekyll 備忘録

Jekyll 備忘録

ruby

bash --login
rvm use ruby-2.5.1 --default

bundler のバージョンを Gemfile.lock の BUNDLED WITH に合わせる

/home/tkobayas/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
gem install bundler -v 1.16.4

Could not find XXX

Run `bundle install` to install missing gems.
bundle install

Gemfile の環境で実行するには

bundle exec jekyll serve

画像が見えないなど

_config.yml の

baseurl: "/"

から

baseurl: ""

に変更して bundle exec jekyll serve

Jekyll-Image-Size

まだいまいちよくわからん

https://github.com/generalui/jekyll-image-size/blob/master/README.md

https://rubygems.org/gems/jekyll-image-size

Droolsブログ : 09 Executable Model

09 Executable Model

この記事は 赤帽エンジニア Advent Calendar 2019 18 日目の記事です。

07 MVEL で書いたように、Drools 7 から Executable Model というオプションが利用可能となっています。これは kjar のビルド時点で DRL を Java クラス化し、実行時の性能を良くしよう、というものです。最新バージョンでは多数のバグがフィックスされ、安定して使えるようになってきました。

利用方法は簡単です。-DgenerateModel=YES というオプションを mvn に付けるだけです。

$ mvn clean install -DgenerateModel=YES

これで Executable Model を使用した kjar がビルドされます。 kjar の利用方法については 05 KJAR を参照ください。

ではサンプルでやってみましょう。

git clone https://github.com/tkobayas/drools-blog.git

今日のエントリはその中の 09_executable-model です。

kjar のプロジェクトはその中の drools-hello-kjar 、実行するテストクライアントのプロジェクトは drools-hello-client です。

drools-hello-kjar の Sample.drl の中には単純なルールが 1000 個入っています。

rule "rule0"
  when
    $p : Person( age >= 0 && age < 5 )
  then
    resultList.add( kcontext.getRule().getName() + " : " + $p );
end

rule "rule1"
  when
    $p : Person( age >= 5 && age < 10 )
  then
    resultList.add( kcontext.getRule().getName() + " : " + $p );
end
...

まずは普通にビルドしてみましょう。

$ cd drools-hello-kjar
$ mvn clean install

そしてテストします。こちらは 1000 個のファクトを投入して逐一 fireAllRules します。

$ cd drools-hello-client
$ mvn test
...
elapsed time for load  = 4828ms
elapsed time for execution = 1272ms

次は executable-model でビルドします。

$ cd drools-hello-kjar
$ mvn clean install -DgenerateModel=YES

"target/generated-sources" ディレクトリを覗いてみると分かりますが、大量の Java コードが生成されています。

$ tree target/generated-sources/
target/generated-sources/
└── drools-model-compiler
    └── main
        └── java
            ├── org
            │   └── example
            │       ├── LambdaPredicate00B17E09F368ECC48D2C9D8501927757.java
            │       ├── LambdaPredicate00BE0AF256D7A54ACF309C5375D52A02.java
            │       ├── LambdaPredicate00CD93B16506F18C96F2AF35D0A99C82.java
            │       ├── LambdaPredicate00E858E9381395E6402284C160581DD8.java
            │       ├── LambdaPredicate011DF5425A3D14FE82E6277403412AAF.java
            │       ├── LambdaPredicate012F668EF4CBE53CC643A6161D4CDFC9.java
            ...

もう一度テストしてみましょう。

$ cd drools-hello-client
$ mvn test
...
elapsed time for load  = 3979ms
elapsed time for execution = 632ms

速くなってますね!

ただし、あくまでこれは人工的なルールでの人工的なテストです。ルールのパフォーマンスは様々な条件が影響しますので、測定時には実際に使うルール、テストシナリオで計測するようにしてください。