IBM Operational Decision Manager メモ - (4) Linux上での環境セットアップ

# はじめに
前回の記事ではSample Server(サンプルとして提供されている構成)を使用してチュートリアルを実施する流れをみてきました。ここではLinux上にRESおよびDecision Centerを構成する作業を実施していきます。

## 関連記事

[IBM Operational Decision Manager メモ - (1) 概要、Linuxへのインストール](https://qiita.com/tomotagwork/items/2bdcc13cc5a896b6a3a1)
[IBM Operational Decision Manager メモ - (2) ルール開発から実行までの流れ](https://qiita.com/tomotagwork/items/446975617acfdb0eda5f)
[IBM Operational Decision Manager メモ - (3) Decision Center利用の流れ](https://qiita.com/tomotagwork/items/5e8b1efbe0072cf5af6b)
[IBM Operational Decision Manager メモ - (4) Linux上での環境セットアップ](https://qiita.com/tomotagwork/items/dd9dc49ed6a67ff876bb)
[IBM Operational Decision Manager メモ - (5) z/OS上での環境セットアップ](https://qiita.com/tomotagwork/items/73ceaf84fb89b5d2af7b)
[IBM Operational Decision Manager メモ - (6) z/OS上でのルール呼び出し](https://qiita.com/tomotagwork/items/577895e05f9ec5e40c06)
[IBM Operational Decision Manager メモ - (7) zODM環境補足](https://qiita.com/tomotagwork/items/fdda485b28c55edae6e6)
# 環境構築

Windows10 のVirtualBox上にRHELを立てて、そこにODMサーバー環境を作っていきます。Rule Designer部分は前の記事でWindows側に構築したものをそのまま使います。最終的に構築したい環境のイメージは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8b95e8f9-295c-5cb4-0bed-2dbf219e69a0.png)

RHEL V8.5
ODM V8.11
Db2 V11.5.4

Windows10
Eclipse 4.16(2020-06R)

RES, Decision Center はJavaアプリとして実装されており、LibertyやWAS、JBossなどのJEEサーバー上で稼働させることができます。RESはJEEではなくスタンドアローンのJavaアプリとしても稼働させることも可能です。
※WASのクラスターを使用することでRESの冗長構成を行うことも可能です。
また、RES, Decision Centerでは各オブジェクト管理のためにデータベースを使うことになります。Db2, Oracle, H2, Derby, MySQLなど利用可能です。
ここでは、RES, Decision CenterのランタイムとしてはLibertyを使用し、データベースにはDb2を使用することにします(いずれもODMに付属のもの)。同一OS上に構築しますが、Libertyプロファイル、DatabaseはRES, Decision Center用に、それぞれ別のものを立てることにします(Db2インスタンスは共通とする)。



参考: [IBM Operational Decision Manager 8.11 - Detailed System Requirements](https://www.ibm.com/software/reports/compatibility/clarity-reports/report/html/softwareReqsForProduct?deliverableId=2D28A510507B11EBBBEA1195F7E6DF31&osPlatforms=AIX|Linux|Mac%20OS|Windows|z/OS&duComponentIds=D002|S003|S006|S005|C006&mandatoryCapIds=30|1|13|25|26&optionalCapIds=341|47|9|1|15)


## 構成 on Linux

### データベースの準備
Db2インストール時に作成したインスタンス"db2inst1"を使用します。今回、RES、Decision Centerを同一OS上に構成しますが、それぞれデータベースは分けることにするので、それぞれのデータベースを作成しておきます。

#### RES用データベース作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/59194df4-521f-023c-e400-2c936d1c9c1e.png)
参考: [Creating the Decision Server database](https://www.ibm.com/docs/en/odm/8.11.0?topic=databases-creating-decision-server-database)

データベースを作成します。

```
[root@Test13 ~]# su - db2inst1
[db2inst1@Test13 ~]$ db2 create db ODMDS
DB20000I  CREATE DATABASE コマンドが正常に完了しました。

[db2inst1@Test13 ~]$ db2 list db directory

 システム・データベース・ディレクトリー

 ディレクトリー中の項目数 = 1

データベース 1 項目:

 データベース別名                     = ODMDS
 データベース名                             = ODMDS
 ローカル・データベース・ディレクトリー = /home/db2inst1
 データベース・リリース・レベル       = 15.00
 コメント                       =
 ディレクトリー項目タイプ             = 間接
 カタログ・データベース・パーティション番号 = 0
 代替サーバー・ホスト名               =
 代替サーバーのポート番号             =

```

ガイドに従ってバッファープールを作成しておきます。

```
[db2inst1@Test13 ~]$ db2 "CREATE BUFFERPOOL BP32K SIZE 2000 PAGESIZE 32K"
DB20000I  SQL コマンドが正常に完了しました。

[db2inst1@Test13 ~]$ db2 "Select * from SYSCAT.BUFFERPOOLS"

BPNAME                                                                                                                           BUFFERPOOLID DBPGNAME                                                                                                                         NPAGES      PAGESIZE    ESTORE NUMBLOCKPAGES BLOCKSIZE   NGNAME                                                                                                              
-------------------------------------------------------------------------------------------------------------------------------- ------------ -------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ------ ------------- ----------- --------------------------------------------------------------------------------------------------------------------------------
IBMDEFAULTBP                                                                                                                                1 -                                                                                                                                         -2        4096 N                  0           0 -                                                                                                                   
BP32K                                                                                                                                       2 -                                                                                                                                       2000       32768 N                  0           0 -                                                                                                                   

  2 レコードが選択されました。
```

#### Decision Center用データベース作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1b0796c0-d0be-8e3e-1d5a-00ed0cb31483.png)

参考: [Creating the Decision Center database](https://www.ibm.com/docs/en/odm/8.11.0?topic=databases-creating-decision-center-database)

データベースを作成します。

```
[db2inst1@Test13 ~]$ db2 create database ODMDC
DB20000I  CREATE DATABASE コマンドが正常に完了しました。

[db2inst1@Test13 ~]$ db2 list db directory

 システム・データベース・ディレクトリー

 ディレクトリー中の項目数 = 2

データベース 1 項目:

 データベース別名                     = ODMDC
 データベース名                             = ODMDC
 ローカル・データベース・ディレクトリー = /home/db2inst1
 データベース・リリース・レベル       = 15.00
 コメント                       =
 ディレクトリー項目タイプ             = 間接
 カタログ・データベース・パーティション番号 = 0
 代替サーバー・ホスト名               =
 代替サーバーのポート番号             =

データベース 2 項目:

 データベース別名                     = ODMDS
 データベース名                             = ODMDS
 ローカル・データベース・ディレクトリー = /home/db2inst1
 データベース・リリース・レベル       = 15.00
 コメント                       =
 ディレクトリー項目タイプ             = 間接
 カタログ・データベース・パーティション番号 = 0
 代替サーバー・ホスト名               =
 代替サーバーのポート番号             =

```

### RES(Rule Execution Server)の構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ad8b12e9-4bfd-3afd-08d6-08b1b9f28f69.png)

参考: [Configuring Rule Execution Server on the Liberty profile](https://www.ibm.com/docs/ja/odm/8.11.0?topic=profile-configuring-rule-execution-server-liberty)
基本的に上のガイドに従って構成していきます。

#### (1) Libertyサーバーの作成/基本構成
参考: [Step 1: Deploying the Rule Execution Server management archive](https://www.ibm.com/docs/en/odm/8.11.0?topic=creslp-step-1-deploying-rule-execution-server-management-archive)

Libertyサーバー"server01"を作成します。

```
[root@Test13 /opt/IBM/wlp/bin]# ./server create server01

サーバー server01 が作成されました。
```

ODMインストールディレクトリに提供されているwarファイルを、上で作成したLibertyサーバーのディレクトリにコピーします。(RESの機能はwarファイルとして提供されています)

res.warファイルのコピー

```
[root@Test13 ~]# cd /opt/IBM/ODM8110/executionserver/applicationservers/WLP
[root@Test13 /opt/IBM/ODM8110/executionserver/applicationservers/WLP]# ls -la
合計 136120
drwxr-xr-x. 2 root root       74  1月 12 18:06 .
drwxr-xr-x. 4 root root       31  1月 12 18:05 ..
-rw-r--r--. 1 root root 59160167  1月 12 18:06 DecisionRunner.war
-rw-r--r--. 1 root root 43291319  1月 12 18:06 DecisionService.war
-rw-r--r--. 1 root root 36926584 11月 10 14:30 res.war
[root@Test13 /opt/IBM/ODM8110/executionserver/applicationservers/WLP]# cp res.war /opt/IBM/wlp/usr/servers/server01/apps/
```

Db2提供のJDBCドライバーをLibertyのディレクトリにコピー

```
[root@Test13 /opt/IBM/wlp/usr/shared/resources]# mkdir db2
[root@Test13 /opt/IBM/wlp/usr/shared/resources]# cd db2
[root@Test13 /opt/IBM/wlp/usr/shared/resources/db2]# cp /opt/ibm/db2/V11.5/java/db2jcc4.jar .
[root@Test13 /opt/IBM/wlp/usr/shared/resources/db2]# ls -la
合計 6416
drwxr-xr-x. 2 root root      25  1月 21 18:52 .
drwxr-xr-x. 3 root root      17  1月 21 18:51 ..
-r--r--r--. 1 root root 6568346  1月 21 18:52 db2jcc4.jar
```

server.xmlを編集して以下の設定を行います。

```xml:server.xml抜粋
        <!-- Enable features -->
        <featureManager>
                <feature>jsp-2.3</feature>
                <feature>servlet-3.1</feature>
                <feature>jdbc-4.1</feature>
                <feature>appSecurity-2.0</feature>
                <feature>concurrent-1.0</feature>
        </featureManager>

        <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
        <httpEndpoint id="defaultHttpEndpoint"
                host="*"
                httpPort="9080"
                httpsPort="9443" />

        <!-- RES data source -->
        <library id="DB2JCCLib">
                <fileset dir="${shared.resource.dir}/db2" includes="db2jcc4.jar"/>
        </library>
        <dataSource id="db2" jndiName="jdbc/resdatasource" isolationLevel="TRANSACTION_READ_COMMITTED">
                <jdbcDriver libraryRef="DB2JCCLib"/>
                <properties.db2.jcc databaseName="ODMDS" serverName="localhost" portNumber="50000"
                        user="db2inst1" password="db2inst1" />
        </dataSource>

        <!-- Web application security -->
        <basicRegistry id="basic" realm="customRealm">
                <user name="resAdmin" password="resAdmin"/>
                <user name="resDeploy" password="resDeploy"/>
                <user name="resMonitor" password="resMonitor"/>
                <group name="resAdministrators">
                        <member name="resAdmin"/>
                </group>
                <group name="resDeployers">
                        <member name="resDeploy"/>
                </group>
                <group name="resMonitors">
                        <member name="resMonitor"/>
                </group>
        </basicRegistry>

        <!-- RES console -->
        <application type="war" id="res" name="res" location="${server.config.dir}/apps/res.war">
                <application-bnd>
                        <security-role name="resAdministrators">
                                <group name="resAdministrators"/>
                        </security-role>
                        <security-role name="resDeployers">
                                <group name="resDeployers"/>
                        </security-role>
                        <security-role name="resMonitors">
                                <group name="resMonitors"/>
                        </security-role>
                </application-bnd>
        </application>

```

※Db2関連の設定についてはODMのマニュアルにはきちんと書いてくれていないので、以下のガイドを参考に設定します。
参考: [Liberty での関連データベース接続の構成](https://www.ibm.com/docs/ja/was-liberty/core?topic=liberty-configuring-relational-database-connectivity-in)

#### (2) HTDS(Hosted Transparent Decision Service)用の構成
参考: [Step 2: Deploying the hosted transparent decision service](https://www.ibm.com/docs/en/odm/8.11.0?topic=profile-step-2-deploying-hosted-transparent-decision-service)
HTDSはルールをWebサービス経由で呼び出す際に必要なコンポーネントで、これもWarファイルとして提供されているので、RESと同じLiberty上にデプロイします。

DecisionServer.warファイルのコピー

```
[root@Test13 ~]# cd /opt/IBM/wlp/usr/servers/server01/apps
[root@Test13 /opt/IBM/wlp/usr/servers/server01/apps]# cp /opt/IBM/ODM8110/executionserver/applicationservers/WLP/DecisionService.war .
[root@Test13 /opt/IBM/wlp/usr/servers/server01/apps]# ls -la
合計 78344
drwxr-x---. 3 root root       64  1月 21 19:28 .
drwxr-x---. 8 root root      175  1月 21 19:17 ..
-rw-r--r--. 1 root root 43291319  1月 21 19:28 DecisionService.war
drwxr-x---. 3 root root       21  1月 21 19:15 expanded
-rw-r--r--. 1 root root 36926584  1月 21 16:57 res.war
```

server.xmlを編集して以下の設定を追加します。

```xml:server.xml抜粋
        <!-- HTDS -->
        <application type="war" id="DecisionService"
                name="DecisionService"
                location="${server.config.dir}/apps/DecisionService.war">
        </application>
```

#### (3) テスト/シミュレーション用の構成
参考: [Step 3: Deploying the testing and simulation archive](https://www.ibm.com/docs/en/odm/8.11.0?topic=profile-step-3-deploying-testing-simulation-archive)
Decision Centerからテスト/シミュレーションを行う際に必要な設定を行います。これらの機能もWarファイルとして提供されているので、RESと同じLiberty上にデプロイします。

DecisionRunner.warファイルのコピー

```
[root@Test13 ~]# cd /opt/IBM/wlp/usr/servers/server01/apps
[root@Test13 /opt/IBM/wlp/usr/servers/server01/apps]# cp /opt/IBM/ODM8110/executionserver/applicationservers/WLP/DecisionRunner.war .
[root@Test13 /opt/IBM/wlp/usr/servers/server01/apps]# ls -la
合計 136120
drwxr-x---. 3 root root       90  1月 21 19:33 .
drwxr-x---. 8 root root      175  1月 21 19:33 ..
-rw-r--r--. 1 root root 59160167  1月 21 19:33 DecisionRunner.war
-rw-r--r--. 1 root root 43291319  1月 21 19:28 DecisionService.war
drwxr-x---. 3 root root       21  1月 21 19:15 expanded
-rw-r--r--. 1 root root 36926584  1月 21 16:57 res.war
```

server.xmlを編集して以下の設定を追加します。

```xml:server.xml抜粋
        <!-- Managed executor service for Decision Runner -->
        <managedExecutorService jndiName="concurrent/drExecutorService"/>

        <!-- Decision Runner -->
        <application type="war" id="DecisionRunner" name="DecisionRunner" location="${server.config.dir}/apps/DecisionRunner.war">
                <application-bnd>
                        <security-role name="resAdministrators">
                                <group name="resAdministrators" />
                        </security-role>
                        <security-role name="resDeployers">
                                <group name="resDeployers" />
                        </security-role>
                </application-bnd>
        </application>
```

最終的に、server.xmlは以下のようになります。

<details><summary><font color="blue">server.xml全体</font></summary><div>

```xml:/opt/IBM/wlp/usr/servers/server01/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">

        <!-- Enable features -->
        <featureManager>
                <feature>jsp-2.3</feature>
                <feature>servlet-3.1</feature>
                <feature>jdbc-4.1</feature>
                <feature>appSecurity-2.0</feature>
                <feature>concurrent-1.0</feature>
        </featureManager>

        <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
        <httpEndpoint id="defaultHttpEndpoint"
                host="*"
                httpPort="9080"
                httpsPort="9443" />

        <!-- Automatically expand WAR files and EAR files -->
        <applicationManager autoExpand="true"/>

        <!-- RES data source -->
        <library id="DB2JCCLib">
                <fileset dir="${shared.resource.dir}/db2" includes="db2jcc4.jar"/>
        </library>
        <dataSource id="db2" jndiName="jdbc/resdatasource" isolationLevel="TRANSACTION_READ_COMMITTED">
                <jdbcDriver libraryRef="DB2JCCLib"/>
                <properties.db2.jcc databaseName="ODMDS" serverName="localhost" portNumber="50000"
                        user="db2inst1" password="db2inst1" />
        </dataSource>

        <!-- Web application security -->
        <basicRegistry id="basic" realm="customRealm">
                <user name="resAdmin" password="resAdmin"/>
                <user name="resDeploy" password="resDeploy"/>
                <user name="resMonitor" password="resMonitor"/>
                <group name="resAdministrators">
                        <member name="resAdmin"/>
                </group>
                <group name="resDeployers">
                        <member name="resDeploy"/>
                </group>
                <group name="resMonitors">
                        <member name="resMonitor"/>
                </group>
        </basicRegistry>

        <!-- RES console -->
        <application type="war" id="res" name="res" location="${server.config.dir}/apps/res.war">
                <application-bnd>
                        <security-role name="resAdministrators">
                                <group name="resAdministrators"/>
                        </security-role>
                        <security-role name="resDeployers">
                                <group name="resDeployers"/>
                        </security-role>
                        <security-role name="resMonitors">
                                <group name="resMonitors"/>
                        </security-role>
                </application-bnd>
        </application>

        <!-- HTDS -->
        <application type="war" id="DecisionService"
                name="DecisionService"
                location="${server.config.dir}/apps/DecisionService.war">
        </application>

        <!-- Managed executor service for Decision Runner -->
        <managedExecutorService jndiName="concurrent/drExecutorService"/>

        <!-- Decision Runner -->
        <application type="war" id="DecisionRunner" name="DecisionRunner" location="${server.config.dir}/apps/DecisionRunner.war">
                <application-bnd>
                        <security-role name="resAdministrators">
                                <group name="resAdministrators" />
                        </security-role>
                        <security-role name="resDeployers">
                                <group name="resDeployers" />
                        </security-role>
                </application-bnd>
        </application>

</server>
```

</div></details>

httpEndpoint以下に、`host="*"`を追記しています(指定無しだとデフォルトで127.0.0.1にしかポートがバインドされないので外部からのアクセスができません)。
ポート番号はデフォルトから変更していないので、http用ポート:9080、https用ポート:9443が使用されます。必要に応じてfiewallの設定など行っておきます。

Libertyを起動します。
※事前にDb2は起動させておきます。また、`/opt/IBM/wlp/bin/`をPATHに通しておきます。

```
[root@Test13 ~]# server start server01

サーバー server01 を始動中です。
サーバー server01 がプロセス ID 5393 で始動しました。
```

#### (4) RES用Db2の構成
参考: [Creating a schema for the Rule Execution Server database](https://www.ibm.com/docs/en/odm/8.11.0?topic=profile-creating-schema-rule-execution-server-database)

RESを使用する際ルールの情報などをDb2に保持することになりますが、そのために各種RES用のテーブルなどをDb2側に準備しておく必要があります。これらは、RESのコンソールに最初にアクセスした時に開くウィザードで設定することができます。
ブラウザから `http://xxx:9080/res` にアクセスしてRESコンソールにログインします。(以降のスクリーンショットはWindows上からアクセスしており、ポートフォワードで19080→9080の変換を行っています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b40aed9f-a5e9-41cb-8b7e-18cc24b5cce1.png)

Db2の構成がされていないので、まずRuleApp用のウィザードが開きます。内容を確認して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fabc89fb-57a6-0c26-ef78-cf69e1181363.png)

データベース・スキーマとしてdb2を選択、先に作成したバッファープール名を指定し、次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2c7989a9-cf2d-b3a6-90fe-bd3b904e6d69.png)

※ちなみにデータベース・スキーマのプルダウンで選択できるメニューは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d82aa6e1-5438-3674-0e09-5add8a0af504.png)

※WebのWizardを使ってスキーマを作成する場合、DBの構成として"Automatic storage"機能が使用されるらしい。Db2 V11.5の場合デフォルトでAutomatic storageが有効になっているので特に対応は不要と判断。
参考: [Databases use automatic storage by default](https://www.ibm.com/docs/en/db2/11.5?topic=storage-databases-use-automatic-by-default)

>Automatic storage can make storage management easier. Rather than managing storage at the table space level using explicit container definitions, storage is managed at the storage group level and the responsibility of creating, extending and adding containers is taken over by the database manager. 
Note: Although, you can create a database specifying the AUTOMATIC STORAGE NO clause, the AUTOMATIC STORAGE clause is deprecated and might be removed from a future release.
By default, all databases are created with automatic storage. However, if the database is created specifying the AUTOMATIC STORAGE NO clause it cannot use automatic storage managed table spaces. 

"SQLスキーマ"db2inst1"の作成"にチェック、"SQLのdropステートメントを保持"にチェックし、実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6575bfd8-2792-db76-6266-d6481b7c496e.png)

"SQLステートメントが正常に実行されました"のメッセージが出力されればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/69fd345e-17e6-f2ab-e9a7-d079e7df248e.png)
※何度かTry&Errorを繰り返したのでメッセージ出力のされ方は状況によって異なると思います。新規で作成する場合はDROPは基本的に警告になるが無視してOK。BufferPool "BP32K"はここでは作成してくれないので事前作成しておく必要あり！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c1932515-a3d1-d602-5f4e-82dc96aa4325.png)

次に、Java XOM用のウィザードが開くので内容を確認して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c0a8633f-2e29-f5cc-92b0-d78bf942a8e3.png)

データベース・スキーマから"db2"を選択して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7902db20-2148-cbc0-66ed-44ddcc230b72.png)

"SQLのdropステートメントを保持"にチェックし、実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5b01e0cf-e023-8268-44f6-07acb8148cd5.png)

"SQLステートメントが正常に実行されました"のメッセージが出力されればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b6b3705a-464f-4753-3bff-ad11cd0f7c29.png)

#### (5) 診断
参考: [Completing the configuration of Rule Execution Server](https://www.ibm.com/docs/en/odm/8.11.0?topic=profile-completing-configuration-rule-execution-server)

RESコンソールにログインし、"診断"タブをクリックします。
Decision Runnerの診断が失敗しています。ここに示されている"インストール・ウィザードを実行してデータベース表を作成してください"のリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4d486b8e-148b-d966-e33b-b2249890f58b.png)

Decision Runner用のウィザードが開くので、内容を確認して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d0b2111a-a274-5e36-3a58-85efc8a84fe1.png)

データベース・スキーマから"db2"を選択して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cc5abe50-23b4-c146-78d2-ffde54e8412d.png)

"SQLスキーマ"db2inst1"の作成"にチェック、"SQLのdropステートメントを保持"にチェックし、実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e7a9ce03-5817-c50f-79e2-0323740a8a98.png)

"SQLステートメントが正常に実行されました"のメッセージが出力されればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cc6b5ce2-3a82-dc01-3dbc-29cdb0e1e81b.png)

RESコンソールの"診断"タブに戻って再実行ボタンをクリックし、結果を確認。以下のようにエラーが出ていなければOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/38c6a51b-057a-4bd7-1b7c-843c15d839c4.png)

### Decision Centerの構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/40057711-877c-ff9f-af2e-0f58c8bb6f1e.png)
参考: [Configuring Decision Center on the Liberty profile](https://www.ibm.com/docs/en/odm/8.11.0?topic=profile-configuring-decision-center-liberty)
基本的に上のガイドに従って構成していきます。

#### (0) 事前準備
参考: [Before you start](https://www.ibm.com/docs/en/odm/8.11.0?topic=cdclp-before-you-start)

Libertyサーバー作成

```
[root@Test13 /opt/IBM/wlp/bin]# ./server create server02

サーバー server02 が作成されました。
```

環境変数設定

```
[root@Test13 ~]# env | grep WLP
WLP_HOME=/opt/IBM/wlp
[root@Test13 ~]# env | grep JAVA
JAVA_HOME=/usr/lib/jvm/ibm-semeru-open-8-jdk

```

#### (1) Db接続構成
参考: [Step 1: Creating a data source](https://www.ibm.com/docs/en/odm/8.11.0?topic=profile-step-1-creating-data-source)

Db2用のJDBCドライバーのファイル(jar)はRES構成でLibertyの共通のディレクトリにコピー済み(`/opt/IBM/wlp/usr/shared/resources/db2/db2jcc4.jar`)。

server.xml編集

```xml:server.xml抜粋
        <!-- Decision Center data source -->

        <library id="DB2JCCLib">
                <fileset dir="${shared.resource.dir}/db2" includes="db2jcc4.jar"/>
        </library>
        <dataSource id="db2" jndiName="jdbc/ilogDataSource" isolationLevel="TRANSACTION_READ_COMMITTED">
                <jdbcDriver libraryRef="DB2JCCLib"/>
                <properties.db2.jcc databaseName="ODMDC" serverName="localhost" portNumber="50000"
                        user="db2inst1" password="db2inst1" />
        </dataSource>
```

※Db2関連の設定についてはODMのマニュアルにはきちんと書いてくれていないので、以下のガイドを参考に設定します。
参考: [Liberty での関連データベース接続の構成](https://www.ibm.com/docs/ja/was-liberty/core?topic=liberty-configuring-relational-database-connectivity-in)

#### (2) ユーザー設定
参考: [Step 2: Configuring user access to Decision Center](https://www.ibm.com/docs/en/odm/8.11.0?topic=profile-step-2-configuring-user-access-decision-center)

ここではユーザー情報はbasec user registry(server.xml内にユーザー情報を持たせる形式)を使用します。LDAPは使用しません。

```xml:server.xml抜粋
        <!-- Web application security -->
        <basicRegistry id="basic" realm="customRealm">
                <user name="rtsAdmin" password="rtsAdmin"/>
                <user name="Jane" password="Jane"/>
                <user name="Bea" password="Bea"/>
                <user name="Rex" password="Rex"/>
                <group name="AdminGroup">
                        <member name="rtsAdmin"/>
                </group>
                <group name="InstallGroup">
                        <member name="rtsAdmin"/>
                </group>
        </basicRegistry>
```

#### (3) Decision Center用Warファイルのデプロイ
参考: [Step 3: Deploying the Decision Center WAR files](https://www.ibm.com/docs/en/odm/8.11.0?topic=profile-step-3-deploying-decision-center-war-files)

Decision CenterもLiberty上のアプリケーション(Warファイル)として実装されているので、これらをデプロイします。

jvmオプションを指定するため、jvm.optionsファイルを作成し、以下の設定を行います。

```/opt/IBM/wlp/usr/servers/server02/jvm.options
-Xms4096m
-Xmx8192m
-Dclient.encoding.override=UTF-8
-Dfile.encoding=UTF-8
```

Warファイルのコピー

```
[root@Test13 ~]# cd /opt/IBM/wlp/usr/servers/server02/apps
[root@Test13 /opt/IBM/wlp/usr/servers/server02/apps]# cp /opt/IBM/ODM8110/teamserver/applicationservers/WLP/decisioncenter.war .
[root@Test13 /opt/IBM/wlp/usr/servers/server02/apps]# cp /opt/IBM/ODM8110/teamserver/applicationservers/WLP/decisioncenter-api.war .
[root@Test13 /opt/IBM/wlp/usr/servers/server02/apps]# cp /opt/IBM/ODM8110/teamserver/applicationservers/WLP/decisionmodel.war .
[root@Test13 /opt/IBM/wlp/usr/servers/server02/apps]# ls -la
合計 496504
drwxr-x---. 2 root root        87  1月 22 14:06 .
drwxr-x---. 5 root root       126  1月 22 14:02 ..
-rw-r--r--. 1 root root 113465965  1月 22 14:05 decisioncenter-api.war
-rw-r--r--. 1 root root 285624581  1月 22 14:05 decisioncenter.war
-rw-r--r--. 1 root root 109324402  1月 22 14:06 decisionmodel.war
```

server.xmlを編集します。
最終的に、server.xmlは以下のようになります。

<details><summary><font color="blue">server.xml全体</font></summary><div>

```xml:/opt/IBM/wlp/usr/servers/server02/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">

        <!-- Enable features -->
        <featureManager>
                <feature>jsp-2.3</feature>
                <feature>servlet-3.1</feature>
                <feature>jdbc-4.1</feature>
                <feature>appSecurity-2.0</feature>
                <feature>jaxrs-2.0</feature>
                <feature>concurrent-1.0</feature>
                <feature>jndi-1.0</feature>
                <feature>ssl-1.0</feature>
                <feature>ldapRegistry-3.0</feature>
        </featureManager>

        <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
        <httpEndpoint id="defaultHttpEndpoint"
                host="*"
                httpPort="9081"
                httpsPort="9444" />

        <!-- Automatically expand WAR files and EAR files -->
        <applicationManager autoExpand="true"/>

        <!-- Decision Center data source -->
        <library id="DB2JCCLib">
                <fileset dir="${shared.resource.dir}/db2" includes="db2jcc4.jar"/>
        </library>
        <dataSource id="db2" jndiName="jdbc/ilogDataSource" isolationLevel="TRANSACTION_READ_COMMITTED">
                <jdbcDriver libraryRef="DB2JCCLib"/>
                <properties.db2.jcc databaseName="ODMDC" serverName="localhost" portNumber="50000"
                        user="db2inst1" password="db2inst1" />
        </dataSource>

        <httpSession cookieName="DCSESSIONID"
                invalidateOnUnauthorizedSessionRequestException="true"/>

        <webContainer deferServletLoad="false"
                enableDefaultIsElIgnoredInTag="true"
                enableJspMappingOverride="true"/>

        <!-- Web application security -->
        <basicRegistry id="basic" realm="customRealm">
                <user name="rtsAdmin" password="rtsAdmin"/>
                <user name="Jane" password="Jane"/>
                <user name="Bea" password="Bea"/>
                <user name="Rex" password="Rex"/>
                <group name="AdminGroup">
                        <member name="rtsAdmin"/>
                </group>
                <group name="InstallGroup">
                        <member name="rtsAdmin"/>
                </group>
        </basicRegistry>

        <!-- Business console -->
        <application type="war" id="decisioncenter"
           name="decisioncenter"
           location="${server.config.dir}/apps/decisioncenter.war">
              <classloader delegation="parentLast" />
           <application-bnd>
             <security-role name="rtsAdministrator">
               <group name="AdminGroup"/>
             </security-role>
             <security-role name="rtsInstaller">
               <group name="InstallGroup"/>
             </security-role>
             <security-role name="rtsUser">
               <special-subject type="ALL_AUTHENTICATED_USERS" />
             </security-role>
           </application-bnd>
        </application>

        <!-- DC REST API -->
        <application type="war" id="decisioncenter-api"
           name="decisioncenter-api"
           location="${server.config.dir}/apps/decisioncenter-api.war">
              <classloader delegation="parentLast" />
           <application-bnd>
             <security-role name="rtsAdministrator">
               <group name="AdminGroup"/>
             </security-role>
             <security-role name="rtsInstaller">
               <group name="InstallGroup"/>
             </security-role>
             <security-role name="rtsUser">
               <special-subject type="ALL_AUTHENTICATED_USERS" />
             </security-role>
           </application-bnd>
        </application>

        <!-- Decision modeling -->
        <application type="war" id="decisionmodel"
           name="decisionmodel"
           location="${server.config.dir}/apps/decisionmodel.war">
              <classloader delegation="parentLast" />
           <application-bnd>
             <security-role name="rtsAdministrator">
               <group name="AdminGroup"/>
             </security-role>
             <security-role name="rtsInstaller">
               <group name="InstallGroup"/>
             </security-role>
             <security-role name="rtsUser">
               <special-subject type="ALL_AUTHENTICATED_USERS" />
             </security-role>
           </application-bnd>
        </application>

</server>
```

</div></details>

httpEndpoint以下に、`host="*"`を追記しています(指定無しだとデフォルトで127.0.0.1にしかポートがバインドされないので外部からのアクセスができません)。
ポート番号はRESとバッティングしないように、http用ポート:9081、https用ポート:9444に変更しています。必要に応じてfiewallの設定など行っておきます。


#### (4) Db2の構成
参考: [Completing the configuration of Decision Center](https://www.ibm.com/docs/en/odm/8.11.0?topic=profile-completing-configuration-decision-center)

さて、ここで、RESと同じようにDecision CenterもDb2上にテーブルなどを作成する必要があるらしいのですが、その作成方法についてのガイドが見当たらりません。前のバージョン(ODM V8.10)であればDecision Center Enterprise Consoleという機能があってそこに最初にアクセスしたタイミングでRESと同様ウィザード形式でDb2の設定を行うことが可能だったらしいです。
参考: [ODM V8.10 - Installation Settings Wizard: Creating the database schema](https://www.ibm.com/docs/en/odm/8.10?topic=wizard-installation-settings-creating-database-schema)
ただし、ODM V8.11からはこのEnterprise Consoleというのは削除されており、この方法が使えません。

参考: [Creating the database schema and uploading message files](https://www.ibm.com/docs/en/odm/8.11.0?topic=cdsumf-create-database-schema-upload-message-files-by-using-ant-tasks)
この辺りの記述を見ると、antスクリプトを使用してDb2の設定ができるらしいのですが、このスクリプトを実行するには extensionModel, extensionData なるものがそれぞれ必要なようで、それらの作り方など詳細がよく分かりません。

上のODM V8.10のマニュアルに以下のような記述があり、どうやら`<instdir>\teamserver\bin`以下に提供されているファイルを使っていたらしい。
>Under Select the extension files you want to use, select one of the following options:
> - Default extensions: The default extensions are available in <InstallDir>\teamserver\bin.
> - Custom extensions (brmx/brdx): Specify the location of your model extension (.brmx) and data extension (.brdx) files.
> - Custom extensions (zip): Specify the location of your .zip files.

ODM V8.11の環境を見てみると以下のようなファイルが提供されていました。これを使ってantスクリプト実行すればよさそうです。

```
[root@Test13 /opt/IBM/ODM8110/teamserver/bin]# ls -la
合計 124
drwxr-xr-x. 2 root root  4096  1月 25 09:10 .
drwxr-xr-x. 8 root root   133  1月 12 18:05 ..
-rw-r--r--. 1 root root 42176 11月 10 20:06 build.xml
-rw-r--r--. 1 root root   615 11月 10 20:23 defaultExtension.brdx
-rw-r--r--. 1 root root  1569 11月 10 20:23 defaultExtension.brmx
-rw-r--r--. 1 root root   933 11月 10 20:23 defaultextensionmessages_de.properties
-rw-r--r--. 1 root root   924 11月 10 20:23 defaultextensionmessages_en.properties
-rw-r--r--. 1 root root   951 11月 10 20:23 defaultextensionmessages_es.properties
-rw-r--r--. 1 root root  1005 11月 10 20:23 defaultextensionmessages_fr.properties
-rw-r--r--. 1 root root   965 11月 10 20:23 defaultextensionmessages_it.properties
-rw-r--r--. 1 root root  1254 11月 10 20:23 defaultextensionmessages_ja.properties
-rw-r--r--. 1 root root  1163 11月 10 20:23 defaultextensionmessages_ko.properties
-rw-r--r--. 1 root root   943 11月 10 20:23 defaultextensionmessages_nl.properties
-rw-r--r--. 1 root root  1009 11月 10 20:23 defaultextensionmessages_pl.properties
-rw-r--r--. 1 root root   965 11月 10 20:23 defaultextensionmessages_pt_BR.properties
-rw-r--r--. 1 root root  2002 11月 10 20:23 defaultextensionmessages_ru.properties
-rw-r--r--. 1 root root   943 11月 10 20:23 defaultextensionmessages_sv.properties
-rw-r--r--. 1 root root  1104 11月 10 20:23 defaultextensionmessages_zh.properties
-rw-r--r--. 1 root root  1110 11月 10 20:23 defaultextensionmessages_zh_TW.properties
-rw-r--r--. 1 root root  6046 11月 10 20:06 l10n-distrib-macrodefs.xml
-rw-r--r--. 1 root root   931 11月 10 20:06 teamserver-anttasks.properties
```

(この辺、全然V8.11のマニュアルから見つけられない...。不親切極まりないですなぁ。初めて構成する人、本当にこのマニュアルで構成できるんだろうか？？？)

上のファイルを使ってantを実行していきますが、このantスクリプトではDecision Centerに接続するようなので事前にDecision Center用のLibertyを起動しておきます。(当然Db2も事前に起動しておきます。)

```
[root@Test13 /]# server start server02

サーバー server02 を始動中です。
サーバー server02 がプロセス ID 16276 で始動しました
```

以下のようにant実行します。

```
[root@Test13 /opt/IBM/ODM8110/teamserver/bin]# ant set-extensions  -DextensionModel=/opt/IBM/ODM8110/teamserver/bin/defaultExtension.brmx -DextensionData=/opt/IBM/ODM8110/teamserver/bin/defaultExtension.brdx -Dserver.url=http://localhost:9081/decisioncenter
Buildfile: /opt/IBM/ODM8110/teamserver/bin/build.xml

set-extensions:
[set-extensions] [serverURL] 'http://localhost:9081/decisioncenter'
[set-extensions] [datasourceName] 'jdbc/ilogDataSource'
[set-extensions] [username] 'rtsAdmin'
[set-extensions] [password] '********'
[set-extensions] [extensionModel] '/opt/IBM/ODM8110/teamserver/bin/defaultExtension.brmx'
[set-extensions] [extensionData] '/opt/IBM/ODM8110/teamserver/bin/defaultExtension.brdx'
[set-extensions] 1 25, 2022 2:25:38 午後 com.ibm.rules.decisioncenter.remoting.internal.RemoteSessionHttpExecutorBuilder log
[set-extensions] 情報: {"url":"http://localhost:9081/decisioncenter","datasource":"jdbc/ilogDataSource","username":"rtsAdmin","message":"Sign in successfully","date":"2022/01/25 14:25:38"}
[set-extensions] Generating tables creation script ...
[set-extensions] Executing tables creation script ...
[set-extensions] Script was executed successfully
[set-extensions] Uploading extensions ...
[set-extensions] Initializing hierarchies data ...
[set-extensions] 1 25, 2022 2:27:20 午後 com.ibm.rules.decisioncenter.remoting.internal.RemoteSessionHttpExecutorBuilder log
[set-extensions] 情報: {"url":"http://localhost:9081/decisioncenter","datasource":"jdbc/ilogDataSource","username":"rtsAdmin","message":"Sign out successfully","date":"2022/01/25 14:27:20"}

BUILD SUCCESSFUL
Total time: 1 minute 43 seconds
```

<details><summary><font color="blue">補足</font></summary><div>

上のant実行時に、Libertyのmessages.logに以下のような謎のエラーが出ていました。バグっぽい気もしますが`select count(*)`でのデッドロックなので影響は無いかと思い一旦放置します。

```log:messages.log
[22/01/25 14:25:40:471 JST] 00000034 ilog.rules.teamserver.model.IlrModelInfo                     W Can't find resource: /ilog/rules/teamserver/model/biggerExtension.brmx
[22/01/25 14:25:40:471 JST] 00000034 ilog.rules.teamserver.model.IlrModelInfo                     W Can't find resource: /ilog/rules/teamserver/model/biggerExtension.brdx
[22/01/25 14:27:16:319 JST] 0000004f eamserver.transaction.logger.IlrSQLInvocationExceptionLogger E select count(*) from DB2INST1.RTSRESOURCE
        Error: com.ibm.db2.jcc.am.SqlTransactionRollbackException: デッドロックまたはタイムアウトのため、現在のトランザクションがロールバックされました。  理由コード "2". SQLCODE=-911, SQLSTATE=40001, DRIVER=4.27.25
        at <unknown class>.a(b7.java:797)
        at <unknown class>.a(b7.java:66)
        at <unknown class>.a(b7.java:140)
        at <unknown class>.c(k6.java:2825)
        at <unknown class>.s(ab.java:1668)
        at <unknown class>.i(ab.java:209)
        at <unknown class>.b(ab.java:96)
        at <unknown class>.a(p.java:32)
        at <unknown class>.i(av.java:150)
        at <unknown class>.al(k6.java:2204)
        at <unknown class>.bq(k7.java:3763)
        at <unknown class>.a(k7.java:4642)
        at <unknown class>.b(k7.java:4215)
        at <unknown class>.bd(k7.java:785)
        at <unknown class>.executeQuery(k7.java:750)
        at <unknown class>.executeQuery(WSJdbcPreparedStatement.java:475)
        at sun.reflect.GeneratedMethodAccessor124.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at ilog.rules.teamserver.transaction.logger.IlrStatementInvocationHandler.executeStatement(IlrStatementInvocationHandler.java:66)
        at ilog.rules.teamserver.transaction.logger.IlrPreparedStatementInvocationHandler.invoke(IlrPreparedStatementInvocationHandler.java:38)
        at com.sun.proxy.$Proxy282.executeQuery(Unknown Source)
        at ilog.rules.teamserver.ejb.service.dao.IlrElementDAOJDBC.canSelectTable(IlrElementDAOJDBC.java:1045)
        at ilog.rules.teamserver.ejb.service.dao.IlrElementDAOJDBC.tableExists(IlrElementDAOJDBC.java:1069)
        at ilog.rules.teamserver.ejb.service.dao.IlrElementDAOJDBC.tableExists(IlrElementDAOJDBC.java:1111)
        at ilog.rules.teamserver.ejb.service.dao.IlrElementDAOJDBC.checkTablesExistAndInitialized(IlrElementDAOJDBC.java:1167)
        at ilog.rules.teamserver.ejb.service.IlrSessionFacadeImpl.checkTablesExistAndInitialized(IlrSessionFacadeImpl.java:9958)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at ilog.rules.teamserver.transaction.IlrTransactionalInvocationHandler.invoke(IlrTransactionalInvocationHandler.java:107)
        at com.sun.proxy.$Proxy262.checkTablesExistAndInitialized(Unknown Source)
        at ilog.rules.teamserver.model.impl.IlrAbstractSession.checkTablesExistAndInitialized(IlrAbstractSession.java:2706)
        at com.ibm.rules.decisioncenter.web.search.IndexerServiceThread.getRefreshPeriod(IndexerServiceThread.java:193)
        at com.ibm.rules.decisioncenter.web.search.IndexerServiceThread$Service.run(IndexerServiceThread.java:114)
        at com.google.common.util.concurrent.AbstractExecutionThreadService$1$2.run(AbstractExecutionThreadService.java:66)
        at com.google.common.util.concurrent.Callables$4.run(Callables.java:119)
        at java.lang.Thread.run(Thread.java:826)
[22/01/25 14:27:16:346 JST] 0000004f com.ibm.rules.decisioncenter.web.search.IndexerService       I Database is still not initialized. Retry in 5 minutes
[22/01/25 14:27:17:313 JST] 00000062 eamserver.transaction.logger.IlrSQLInvocationExceptionLogger E select count(*) from DB2INST1.RTSRESOURCE
        Error: com.ibm.db2.jcc.am.SqlTransactionRollbackException: デッドロックまたはタイムアウトのため、現在のトランザクションがロールバックされました。  理由コード "2". SQLCODE=-911, SQLSTATE=40001, DRIVER=4.27.25
        at <unknown class>.a(b7.java:797)
        at <unknown class>.a(b7.java:66)
        at <unknown class>.a(b7.java:140)
        at <unknown class>.c(k6.java:2825)
        at <unknown class>.s(ab.java:1668)
        at <unknown class>.i(ab.java:209)
        at <unknown class>.b(ab.java:96)
        at <unknown class>.a(p.java:32)
        at <unknown class>.i(av.java:150)
        at <unknown class>.al(k6.java:2204)
        at <unknown class>.bq(k7.java:3763)
        at <unknown class>.a(k7.java:4642)
        at <unknown class>.b(k7.java:4215)
        at <unknown class>.bd(k7.java:785)
        at <unknown class>.executeQuery(k7.java:750)
        at <unknown class>.executeQuery(WSJdbcPreparedStatement.java:475)
        at sun.reflect.GeneratedMethodAccessor124.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at ilog.rules.teamserver.transaction.logger.IlrStatementInvocationHandler.executeStatement(IlrStatementInvocationHandler.java:66)
        at ilog.rules.teamserver.transaction.logger.IlrPreparedStatementInvocationHandler.invoke(IlrPreparedStatementInvocationHandler.java:38)
        at com.sun.proxy.$Proxy282.executeQuery(Unknown Source)
        at ilog.rules.teamserver.ejb.service.dao.IlrElementDAOJDBC.canSelectTable(IlrElementDAOJDBC.java:1045)
        at ilog.rules.teamserver.ejb.service.dao.IlrElementDAOJDBC.tableExists(IlrElementDAOJDBC.java:1069)
        at ilog.rules.teamserver.ejb.service.dao.IlrElementDAOJDBC.tableExists(IlrElementDAOJDBC.java:1111)
        at ilog.rules.teamserver.ejb.service.dao.IlrElementDAOJDBC.checkTablesExistAndInitialized(IlrElementDAOJDBC.java:1167)
        at ilog.rules.teamserver.ejb.service.IlrSessionFacadeImpl.checkTablesExistAndInitialized(IlrSessionFacadeImpl.java:9958)
        at ilog.rules.teamserver.ejb.service.IlrSessionFacadeImpl.loginInitializationWithTxnPart1(IlrSessionFacadeImpl.java:316)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at ilog.rules.teamserver.transaction.IlrTransactionalInvocationHandler.invoke(IlrTransactionalInvocationHandler.java:107)
        at com.sun.proxy.$Proxy262.loginInitializationWithTxnPart1(Unknown Source)
        at ilog.rules.teamserver.ejb.service.IlrLocalSessionImpl.loginInitializationWithTxnPart1(IlrLocalSessionImpl.java:69)
        at ilog.rules.teamserver.ejb.service.IlrSessionFacadeImpl.login(IlrSessionFacadeImpl.java:275)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at ilog.rules.teamserver.transaction.IlrTransactionalInvocationHandler.invoke(IlrTransactionalInvocationHandler.java:107)
        at com.sun.proxy.$Proxy262.login(Unknown Source)
        at ilog.rules.teamserver.ejb.service.IlrLocalStealthySessionFactory.makeSession(IlrLocalStealthySessionFactory.java:95)
        at ilog.rules.teamserver.ejb.service.IlrLocalStealthySessionFactory.connect(IlrLocalStealthySessionFactory.java:59)
        at ilog.rules.teamserver.ejb.service.IlrLocalStealthySessionFactory.connect(IlrLocalStealthySessionFactory.java:45)
        at com.ibm.rules.decisioncenter.sqllogging.LongSqlQueryManagerThreadService.createSession(LongSqlQueryManagerThreadService.java:313)
        at com.ibm.rules.decisioncenter.sqllogging.LongSqlQueryManagerThreadService.updateSqlLoggingParameter(LongSqlQueryManagerThreadService.java:259)
        at com.ibm.rules.decisioncenter.sqllogging.LongSqlQueryManagerThreadService.timedParametersUpdate(LongSqlQueryManagerThreadService.java:167)
        at com.ibm.rules.decisioncenter.sqllogging.LongSqlQueryManagerThreadService.run(LongSqlQueryManagerThreadService.java:154)
        at com.google.common.util.concurrent.AbstractExecutionThreadService$1$2.run(AbstractExecutionThreadService.java:66)
        at com.google.common.util.concurrent.Callables$4.run(Callables.java:119)
        at java.lang.Thread.run(Thread.java:826)
[22/01/25 14:27:17:643 JST] 0000002b ilog.rules.teamserver.model.IlrModelInfo                     W Can't find resource: /ilog/rules/teamserver/model/biggerExtension.brmx
[22/01/25 14:27:17:644 JST] 0000002b ilog.rules.teamserver.model.IlrModelInfo                     W Can't find resource: /ilog/rules/teamserver/model/biggerExtension.brdx
[22/01/25 14:27:17:660 JST] 00000062 s.decisioncenter.sqllogging.LongSqlQueryManagerThreadService I  Schema not available, long SQL query logging parameters persistence is aborted
[22/01/25 14:27:18:222 JST] 00000029 ilog.rules.teamserver.dbmapping.schema.IlrSQLAdapter         I Running checkMaxColumnLength() for datasource 'jdbc/ilogDataSource', initial length = 128
[22/01/25 14:27:18:787 JST] 00000029 ilog.rules.teamserver.dbmapping.schema.IlrSQLAdapter         I Completed checkMaxColumnLength() for datasource 'jdbc/ilogDataSource', final length = 128
[22/01/25 14:27:37:973 JST] 0000005c com.ibm.rules.decisioncenter.json                            I {"date":"2022\/01\/25 14:27:37","system":{"ldapMode":"None","solrLocation":"\/tmp\/decisioncenter-solr-v6","buildCachePath":"\/tmp\/rtscache_root","NPSEnabled":"true","solrMode":"SolrEmbedded"},"datasource":{"schemaVersion":"JRules 8.10.5","driver":"DB2\/LINUXX8664 SQL110540","isolationLevel":"TRANSACTION_READ_COMMITTED","datasourceName":"jdbc\/ilogDataSource"},"userAgent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/97.0.4692.99 Safari\/537.36","message":"Connected user","user":{"displayName":"rtsAdmin","groups":[],"userName":"rtsAdmin"},"timestamp":1643088457788}
[22/01/25 14:27:38:705 JST] 0000006a com.ibm.ws.logging.internal.impl.IncidentImpl                I FFDC1015I: FFDC 発生事象が作成されました: "sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target com.ibm.ws.ssl.core.WSX509TrustManager checkServerTrusted" ロケーション: ffdc_22.01.25_14.27.38.0.log
[22/01/25 14:27:38:710 JST] 0000006a com.ibm.ws.ssl.core.WSX509TrustManager                       E CWPKI0823E: SSL ハンドシェークの失敗: SubjectDN [CN=www.ibm.com, O=International Business Machines Corporation, L=Armonk, ST=New York, C=US] の署名者がホスト [www.ibm.com:443] から送信されました。  SSL 構成別名 [defaultSSLConfig] にあるトラストストア [/opt/IBM/wlp/usr/servers/server02/resources/security/key.p12] にこの署名者を追加する必要がある可能性があります。  SSL ハンドシェーク例外からの拡張エラー・メッセージ: [PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]
[22/01/25 14:27:38:762 JST] 0000006a com.ibm.ws.ssl.core.WSX509TrustManager                       E CWPKI0823E: SSL ハンドシェークの失敗: SubjectDN [CN=www.ibm.com, O=International Business Machines Corporation, L=Armonk, ST=New York, C=US] の署名者がホスト [www.ibm.com:443] から送信されました。  SSL 構成別名 [defaultSSLConfig] にあるトラストストア [/opt/IBM/wlp/usr/servers/server02/resources/security/key.p12] にこの署名者を追加する必要がある可能性があります。  SSL ハンドシェーク例外からの拡張エラー・メッセージ: [PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]
[22/01/25 14:27:38:764 JST] 0000006a ilog.rules.teamserver.model.util.HelpService                 W Help service is not accessible [PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]
[22/01/25 14:27:39:648 JST] 00000034 com.ibm.rules.decisioncenter.services.dmn                    E Error trying to reach http://localhost:19081/decisionmodel. Cannot get resource directory. We will try 'cachebustdir' by default
[22/01/25 14:27:40:819 JST] 00000034 com.ibm.ws.webcontainer.servlet                              I SRVE0242I: [decisioncenter] [/decisioncenter] [/WEB-INF/views/page.jsp]: 初期化が成功しました。
[22/01/25 14:27:41:427 JST] 0000002d com.ibm.ws.webcontainer.servlet                              I SRVE0242I: [decisioncenter] [/decisioncenter] [dmn]: 初期化が成功しました。
[22/01/25 14:27:41:632 JST] 0000002d com.ibm.ws.webcontainer.util.ApplicationErrorUtils           E SRVE0777E: アプリケーション・クラス 'org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect:156' によって例外がスローされました
org.apache.http.conn.HttpHostConnectException: Connect to localhost:19081 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: 接続を拒否されました (Connection refused)
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:156)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
        at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:118)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
        at org.mitre.dsmiley.httpproxy.ProxyServlet.doExecute(ProxyServlet.java:333)
        at com.ibm.rules.decisioncenter.web.core.servlets.DmnProxyServlet.doExecute(DmnProxyServlet.java:134)
        at org.mitre.dsmiley.httpproxy.ProxyServlet.service(ProxyServlet.java:275)
        at com.ibm.rules.decisioncenter.web.core.servlets.DmnProxyServlet.service(DmnProxyServlet.java:143)
        at <unknown class>.service(HttpServlet.java:790)
        at <unknown class>.service(ServletWrapper.java:1258)
        at <unknown class>.handleRequest(ServletWrapper.java:746)
        at <unknown class>.handleRequest(ServletWrapper.java:443)
        at <unknown class>.invokeTarget(WebAppFilterChain.java:183)
        at <unknown class>.doFilter(WebAppFilterChain.java:94)
        at com.ibm.rules.decisioncenter.web.core.filters.SecurityCheckPointFilter.doFilter(SecurityCheckPointFilter.java:104)
        at <unknown class>.doFilter(FilterInstanceWrapper.java:201)
        at <unknown class>.doFilter(WebAppFilterChain.java:91)
        at com.ibm.rules.decisioncenter.web.core.filters.SessionFilter.doFilter(SessionFilter.java:64)
        at <unknown class>.doFilter(FilterInstanceWrapper.java:201)
        at <unknown class>.doFilter(WebAppFilterChain.java:91)
        at com.ibm.rules.decisioncenter.web.core.filters.HttpPUTRequestFilter.doFilterInternal(HttpPUTRequestFilter.java:85)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at <unknown class>.doFilter(FilterInstanceWrapper.java:201)
        at <unknown class>.doFilter(WebAppFilterChain.java:91)
        at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:126)
        at org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:64)
        at org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:101)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:119)
        at <unknown class>.doFilter(FilterInstanceWrapper.java:201)
        at <unknown class>.doFilter(WebAppFilterChain.java:91)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at <unknown class>.doFilter(FilterInstanceWrapper.java:201)
        at <unknown class>.doFilter(WebAppFilterChain.java:91)
        at <unknown class>.doFilter(WebAppFilterManager.java:1002)
        at <unknown class>.invokeFilters(WebAppFilterManager.java:1140)
        at <unknown class>.handleRequest(WebApp.java:5049)
        at <unknown class>.handleRequest(DynamicVirtualHost.java:314)
        at <unknown class>.handleRequest(WebContainer.java:1007)
        at <unknown class>.run(DynamicVirtualHost.java:279)
        at <unknown class>.run(HttpDispatcherLink.java:1159)
        at <unknown class>.wrapHandlerAndExecute(HttpDispatcherLink.java:428)
        at <unknown class>.ready(HttpDispatcherLink.java:387)
        at <unknown class>.handleDiscrimination(HttpInboundLink.java:566)
        at <unknown class>.handleNewRequest(HttpInboundLink.java:500)
        at <unknown class>.processRequest(HttpInboundLink.java:360)
        at <unknown class>.complete(HttpICLReadCallback.java:70)
        at <unknown class>.requestComplete(WorkQueueManager.java:504)
        at <unknown class>.attemptIO(WorkQueueManager.java:574)
        at <unknown class>.workerRun(WorkQueueManager.java:958)
        at <unknown class>.run(WorkQueueManager.java:1047)
        at com.ibm.ws.threading.internal.ExecutorServiceImpl$RunnableWrapper.run(ExecutorServiceImpl.java:238)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:826)
Caused by: java.net.ConnectException: 接続を拒否されました (Connection refused)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:607)
        at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75)
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
        ... 61 more

[22/01/25 14:27:41:655 JST] 0000002d com.ibm.ws.logging.internal.impl.IncidentImpl                I FFDC1015I: FFDC 発生事象が作成されました: "org.apache.http.conn.HttpHostConnectException: Connect to localhost:19081 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: 接続を拒否されました (Connection refused) com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest() 830" ロケーション: ffdc_22.01.25_14.27.41.0.log
[22/01/25 14:27:41:757 JST] 0000002d com.ibm.ws.logging.internal.impl.IncidentImpl                I FFDC1015I: FFDC 発生事象が作成されました: "com.ibm.ws.webcontainer.webapp.WebAppErrorReport: org.apache.http.conn.HttpHostConnectException: Connect to localhost:19081 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: 接続を拒否されました &#40;Connection refused&#41; com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter 82" ロケーション: ffdc_22.01.25_14.27.41.1.log
[22/01/25 14:27:41:787 JST] 0000002d com.ibm.ws.logging.internal.impl.IncidentImpl                I FFDC1015I: FFDC 発生事象が作成されました: "com.ibm.ws.webcontainer.webapp.WebAppErrorReport: org.apache.http.conn.HttpHostConnectException: Connect to localhost:19081 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: 接続を拒否されました &#40;Connection refused&#41; com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter 144" ロケーション: ffdc_22.01.25_14.27.41.2.log

```

</div></details>

ブラウザから`http://xxx:9081/decisioncenter`にアクセスし、Decision Centerにログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/43f42e4c-d192-7fb4-aaa6-c5a2685a2e6e.png)


Decision Centerにアクセスできました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2ee47cbc-69c1-f915-e8d0-6e198b0a102a.png)


※参考: Db2のテーブル設定などが完了していないと、ログイン時に以下のようなエラーが表示されてログインに失敗します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/520e3549-4ba6-d01a-15d6-acad02b0f2fd.png)


# 稼働確認

前の記事でSample Serverを使って実施したTutorialを流用して、今回作成したRES、Decision Centerでルールを扱えるかどうか確認してみます。

ここで稼働確認しようとしている環境の全体像は以下のイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e3f3286c-e67d-7173-7d5b-87d31e47ef0e.png)


## RESの利用

### RESへのルール・セットのデプロイ
Rule DesignerでDeployment Configの設定でTarget Serverを定義しますが、そこに今回作成したRESを追加登録します。
手順としては以下の辺り。
https://qiita.com/tomotagwork/items/446975617acfdb0eda5f#step-3-deploying-the-ruleset

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/42fd1357-f5fa-9890-bc6d-8e35e1c4eedc.png)

server01という名前で今回のターゲットとなるRESを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f7188124-d4a0-2740-bbca-95e5c9726651.png)

で、デプロイ処理を進めますが、その際ターゲットとして上で追加したserver01を指定してデプロイを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3ff9a8d1-4697-73c3-00bc-2e632088ef3f.png)

デプロイ完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cd7a8588-3670-0f53-f9e4-969f3b5fc383.png)

RESコンソールでルール・セットが登録されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/00582781-c489-f50a-8dd6-a6f95e0d08f7.png)

### テスト実行
サンプル・アプリケーションが稼働するLiberty Serverとしては、Sample Server(odm81100)をそのまま使います。呼び出すルールの稼働環境として、今回新たに作成したRESのアドレスを指定します。

ルール呼び出しが行えました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/95b6a104-e149-51f7-9a39-73cbeb6452fa.png)

RESコンソールで統計情報も確認しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/876e7788-ba56-fcc1-0aa5-a531b64c2a32.png)

## Decision Centerの利用

### Decision Centerへのルール・セットのデプロイ

Rule DesignerからDecision Centerへのデプロイも行います。
手順としては以下の辺り。
https://qiita.com/tomotagwork/items/446975617acfdb0eda5f#task-7-publishing-to-decision-center

Rule DesignerからDecision Centerに接続してプロジェクトを同期します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4a7bb120-1989-f5df-5636-c08d39bafeb3.png)

Decision Centerでライブラリーを参照し、プロジェクトが同期されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a4296dc0-1f60-4b29-f8a9-fe9abf2a3b40.png)

Decision Center上でルールが管理できることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e1dc3a0d-8c25-39b6-745d-91555ed08e7d.png)