TOP>製品/サービス>カテゴリから探す>ディシジョンオートメーション>Progress Corticon>【Corticon Tech コラム】

Progress Corticon

【Corticon Tech コラム】

No.29 アプリケーションサーバを使わないCortion ディシジョンサービスの実行手順:中編(2018年10月17日)

No.29 アプリケーションサーバを使わないCortion ディシジョンサービスの実行手順:中編(2018年10月17日)

前編 で解説した準備ができましたら、次にJavaクライアントアプリケーションを作成しましょう。


4.Java クライアントアプリケーションを作成する

パースペクティブを Corticon から Java に切り替える

Java パースペクティブに切り替えます。

画像1

プロジェクトと Java のビルド・パスにライブラリを追加する

インストール済みの Corticon Server 内の JAR ファイルは、インプロセスのサーバ(ルールエンジン)として使用できます。 必要な JAR ファイルを”参照”する方法もありますが、ここでは、インプロセスサーバが独立して動作することを明確にするために、プロジェクトに追加します。

  1. 以下 7 つの jar ファイルを Corticon Server のフォルダ [CORTICON_HOME]/Server/lib からコピーします。
    ・ ant_launcher.jar
    ・ CcConfig.jar
    ・ CcExtensions.jar
    ・ CcI18nBundles.jar
    ・ CcLicense.jar
    ・ CcServer.jar
    ・ CcThirdPartyJars.jar
  2. これらのファイルを InProcessApp プロジェクトのルートに貼り付けます。
  3. InProcessApp 上で右クリックし、[プロパティ]を選択し、[Javaのビルド・パス]を選択します。
  4. ライブラリータブを選択し、[JARの追加]をクリックします。

画像2

  5. Java クラスパスに以下の JAR ファイルを選択します。

画像3

  6. [OK]ボタンをクリックします。

ディシジョンサービスをデプロイしアクセスする Java クライアントを作成する

Java クライアントでディシジョンサービスをデプロイしてアクセスするための Corticon API を使ったJava コードを作成します。
  1. InProcessApp プロジェクトで [新規] > [パッケージ] を選択します。名前に「program」と入力します。
  2. program パッケージをクリックし、[新規] > [クラス] を選択します。名前に「InvokeDS」と入力します。
  3. InvokeDS.java の編集画面が開きます。

    ① クライアントプログラムでは、以下のように、必要なパッケージとクラスをインポートすることから
      始めます。


package program;

import com.corticon.eclipse.server.core.CcServerFactory;
import com.corticon.eclipse.server.core.ICcServer;
import com.corticon.service.ccserver.*;

import cargoLibrary.*;

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

    ② 以下の3つの情報を格納する String 型の変数を作成します。
      ・ デプロイするディシジョンサービス名
      ・ インプロセスで起動する Corticon Server にデプロイする .eds ファイ名
      ・ CSVファイル名
        ディシジョンサービス名は、コンパイル時に指定したディシジョンサービス名にします。
       ここでは、「Cargo」です。


public class InvokeDS {
  private static String dsName = "Cargo";
  private static String edsFileName = "C:/Users/user01/Desktop/App/Cargo_V0_16.eds";
  private static String csvFileName = "C:/Users/user01/Desktop/App/sample.csv";;

    ③ Cargoエンティティクラスのオブジェクトを作成し、CSVファイルのデータを Cargo オブジェクトに
      変換します。
      今回サンプルで想定している入力データのフォーマットは以下のとおりです。
      1番目:volume, 2番目:weight

画像4

      ルールで処理された結果、3番目の項目としてcontainerの値が入ります。

    ④ 入力 CSV ファイルのデータを、1 件ずつ読み込み、Cargo オブジェクトに格納します。
      作成したCargoオブジェクトは ArrayList に格納します。


public void callDS(){
  try {
    // CSVファイルのデータをCargoオブジェクトに変換
    List<Cargo> cargoList = new ArrayList<>();
    List<String> readLines = Files.readAllLines(Paths.get(csvFileName), StandardCharsets.UTF_8);
    for (String line: readLines) {
      Cargo cargo = new Cargo();
      cargo.setVolume(Long.parseLong(line.split(",")[0]));
      cargo.setWeight(Long.parseLong(line.split(",")[1]));
      cargoList.add(cargo);
    }

    ⑤ Javaプログラム内からCorticon Server を起動します。
      Corticon Serverをインプロセスで起動する場合は、CcServerFactory クラスの getCcServer メソッドを
      実行します。実行した結果、生成された Corticon Server オブジェクトは ICcServer インターフェイスを
      備えています。


    // Corticon Serverの起動
    ICcServer server = CcServerFactory.getCcServer();

    ⑥ Corticon Server オブジェクト"server" で addDecisionService() メソッドを使用して、ディシジョン
      サービスをデプロイします。
      今回は、Corticon Studio でプリコンパイルした「Cargo_v0_16.eds」をデプロイします。
      ディシジョンサービスをデプロイする前に、「if」ステートメントで、ディシジョンサービスが既にロード
      済みかどうかをチェックします。
      addDecisionService() メソッドは、最低 3 つのパラメータ(ディシジョンサービス名、コンパイル済み
      EDSファイル名、動的再読み込みを示すブーリアン型(true/false))を渡す必要があります。


    // デシジョンサービスのデプロイ
    if (server.isDecisionServiceDeployed(dsName)==false) {
      server.addDecisionService(dsName, edsFileName , false);
    }

    ⑦ ディシジョンサービスを実行します。
      execute() メソッドは、 2 つのパラメータ(ディシジョンサービス名、受け渡しデータオジェクト)を
      指定します。
      Corticon Server にデプロイしたディシジョンサービスのルールに応じて、渡されたデータ"cargoList” が
      更新されます。
      execute() メソッドの戻り値は、ICcRuleMessages 型のオブジェクトで、ルール実行結果のルール
      メッセージを受け取ります。


    // デシジョンサービスの実行
    ICcRuleMessages msgs = server.execute(dsName, cargoList);

    ⑧ ルール実行結果の戻り値を含む Cargo オブジェクトを、CSV ファイルに書き込みます。
      ここでは、入力ファイル名の接尾辞として「_2」を付与しています。


    // 結果のCargoオブジェクトをCSVファイルに書き込み
    List<String> writeLines = new ArrayList<>();
    for (Cargo cargo: cargoList) {
      writeLines.add(cargo.getVolume() + "," + cargo.getWeight() + "," + cargo.getContainer());
    }
    Files.write(Paths.get(csvFileName.replace(".", "_2.")), writeLines, StandardCharsets.UTF_8);

    ⑨ ルールメッセージを個別のメッセージごとにループし、Cargo オブジェクトとメッセージ内容を
      コンソールに出力します。message オブジェクトの getEntityReference() メソッドを使用すると参照する
      エンティティのオブジェクトを取得することができます。
      ここでは、Cargo エンティティになるため、Cargo 型変数 "x" に変換しています。


      // ルールメッセージの表示
      for (Object msg: msgs.getMessages()) {
        ICcRuleMessage m = (ICcRuleMessage) msg;
        Cargo x = (Cargo) m.getEntityReference();
    
        System.out.println("  ");
        System.out.println("Cargo の volume : "+x.getVolume());
        System.out.println("Cargo の weight : "+x.getWeight());
        System.out.println("Cargo の container の値 : "+x.getContainer());
        System.out.println(m.getSeverity());
        System.out.println(m.getText());
      }

    ⑩ try ブロックに対する catch ブロックを追加します。


  } catch(Exception e){
    System.out.println(e);
  }
}

    ⑪ 最後に、Java の main メソッドを書きます。
      ここでは、main メソッドの引数として、csv ファイル名と eds ファイル名を指定できるようにして
      います。


  public static void main(String[] args) {
    if (args.length > 0) {
      csvFileName = args[0];
    }
    if (args.length > 1) {
      edsFileName = args[1];
    }
    InvokeDS d = new InvokeDS();
    d.callDS();
  }

ディシジョンサービスをデプロイしてアクセスする Java クライアントアプリケーション「program」の全体は次のようになります。


package program;
import com.corticon.eclipse.server.core.CcServerFactory;
import com.corticon.eclipse.server.core.ICcServer;
import com.corticon.service.ccserver.*;
import cargoLibrary.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class InvokeDS {
  private static String dsName = "Cargo";
  private static String edsFileName = "C:/Users/user01/Desktop/App/Cargo_V0_16.eds";
  private static String csvFileName = "C:/Users/user01/Desktop/App/sample.csv";;
  
  public void callDS(){
    try {
      // CSVファイルのデータをCargoオブジェクトに変換
      List<Cargo> cargoList = new ArrayList<>();
      List<String> readLines = Files.readAllLines(Paths.get(csvFileName), StandardCharsets.UTF_8);
      for (String line: readLines) {
        Cargo cargo = new Cargo();
        cargo.setVolume(Long.parseLong(line.split(",")[0]));
        cargo.setWeight(Long.parseLong(line.split(",")[1]));
        cargoList.add(cargo);
      }
      
      // Corticon Serverの起動
      ICcServer server = CcServerFactory.getCcServer();
      
      // デシジョンサービスのデプロイ
      if (server.isDecisionServiceDeployed(dsName)==false) {
        server.addDecisionService(dsName, edsFileName , false);
      }
      
      // デシジョンサービスの実行
      ICcRuleMessages msgs = server.execute(dsName, cargoList);
      
      // 結果のCargoオブジェクトをCSVファイルに書き込み
      List<String> writeLines = new ArrayList<>();
      for (Cargo cargo: cargoList) {
        writeLines.add(cargo.getVolume() + "," + cargo.getWeight() + "," + cargo.getContainer());
      }
      Files.write(Paths.get(csvFileName.replace(".", "_2.")), writeLines, StandardCharsets.UTF_8);
      
      // ルールメッセージの表示
      for (Object msg: msgs.getMessages()) {
        ICcRuleMessage m = (ICcRuleMessage) msg;
        Cargo x = (Cargo) m.getEntityReference();
    
        System.out.println("  ");
        System.out.println("Cargo の volume : "+x.getVolume());
        System.out.println("Cargo の weight : "+x.getWeight());
        System.out.println("Cargo の container の値 : "+x.getContainer());
        System.out.println(m.getSeverity());
        System.out.println(m.getText());
      }
    } catch(Exception e){
      System.out.println(e);
    }
  }
  public static void main(String[] args) {
    if (args.length > 0) {
      csvFileName = args[0];
    }
    if (args.length > 1) {
      edsFileName = args[1];
    }
    InvokeDS d = new InvokeDS();
    d.callDS();
  }
}

  4. Java クライアントソースコードを保存します。

続きは『後編 』で解説します。


著者紹介

毛井さん

株式会社アシスト 情報基盤事業部 製品統括部プログレス推進部

株式会社アシスト入社以来、5インチFDを使うソフトウェアやメイン
フレームの簡易開発言語の時代から現在のProgress Corticonまで、
製品の日本語化や技術サポート、研修などを行う。

「Corticon Tech コラム」記事一覧


お求めの情報は見つかりましたでしょうか。

資料請求/お問い合わせはこちら(専門の担当者が確認し、ご対応します。)

お客様の状況に合わせて詳しい情報をお届けできます。お気軽にご相談ください。

ページの先頭へ戻る