PEXA Serviceについて

チュートリアル

テストツール

定義ファイル

基本プロセス

拡張プロセス

Condition

セッション

モデル

リファレンス

環境設定

目次

  1. はじめに
  2. ClientFrameworkからの呼出で実行
  3. ServiceClientからの呼出で実行
  4. Serviceから他のServiceを実行
  5. JavaAPIによる呼出で実行
  6. ModelFrameworkからProcedureとして実行
  7. ModelEventによる疎結合での呼出で実行


はじめに

このドキュメントは、PEXAサービスフレームワーク上で動作するサービスをどのように呼び出して実行することが出来るのかを説明するドキュメントです。

サービスには呼出方法が何種類かあり、通常の呼出に加えてModelFrameworkからProcedure実装として呼び出したり、 ModelEventによる疎結合での呼出方法なども用意されています。

これらの方法には単に呼び出すための口が違うだけのものもあれば、パラメータの受け渡しに特殊なセッションキーを使用するケースなどもあるので、 以降でそれぞれのケースにおける呼出した側と呼び出された側双方についてサンプルを交えて説明します。


ClientFrameworkからの呼出で実行

ClientFrameworkからの呼出は、ここで紹介する方法の中で最も一般的な呼出方法です。
ClientFrameworkのContent定義でActionを記述し、その中でdoService命令を使用して呼び出す形になります。

呼出元での記述内容

ClientFrameworkからサービス呼出を行う手段は、Content定義のActionでdoService命令のみとなります。
このdoService命令で、呼び出すサービスの名前、実行時パラメータ、サービスから取得する返値を指定します。

記述例:ログイン処理を行うサービスをClientから呼び出す

<action id="ログイン">
    <doService service="ログインする">
        <inputServiceSession>
            <inputValue key="利用者コード" item="ログインユーザー利用者コード"/>
            <inputValue key="利用者認証情報" item="ログインユーザー利用者認証情報"/>
            <inputValue item="会社No"/>
        </inputServiceSession>
        <outputServiceSession>
            <outputValue key="利用者情報" item="ログイン利用者情報"/>
            <outputValue item="ログイン会社情報"/>
            <outputValue item="ログイン部門情報"/>
        </outputServiceSession>
    </doService>
</command>
詳細についてはClientFrameworkのContent定義およびAction命令の開発ガイドを参照して下さい。


呼び出されたサービスでの記述内容

この呼出方法の場合は、呼び出されたサービス側で気をつけるべき事は特にありません。
呼出元から渡される実行時パラメータのセッションキーも、呼出元に返す実行結果のセッションキーも共に任意のキーを指定することが出来ます。



ServiceClientからの呼出で実行

ServiceClientを使用してサービスを呼び出す場合は、呼出設定を記述したServiceClient実行設定ファイルを記述して それをServiceClientに読み込ませて実行する形になります。

呼出元での記述内容

ServiceClient自体はJavaプログラムとして提供されており、バッチファイルやスクリプトファイルなど任意の方法で 呼び出すことが出来るようになっています。このJavaプログラムとしてのServiceClientに対して実行設定ファイルを 読み込ませるとその内容に従ってサービスフレームワークを呼び出してサービスを実行することが出来ます。

記述例:2つのサービスを順に呼び出すServiceClient実行設定ファイル

;---------------------------------------------------------------
; Release-Date:     $Date:: 2009-11-07 17:19:30 #$
; Release-Version:  $Revision: 4347 $
; Author:           $Author: morishita $
; First-Created-On: 2007/04/16
; First-Created-By: Daisuke Morishita
;---------------------------------------------------------------
; サービスの呼出情報
;---------------------------------------------------------------
[services
    ;-----------------------------------------------------------
    ; アラート生成サービスの呼出
    ;-----------------------------------------------------------
    (アラートを生成する
        (session
        	実行日付	&Today
	        実行時刻    &Now
        )
    )
    ,
    ;-----------------------------------------------------------
    ; リマインダ生成サービスの呼出
    ;-----------------------------------------------------------
    (リマインダを生成する
        (session
        	実行日付	&Today
	        実行時刻    &Now
        )
    )
]
このServiceClient実行設定ファイルについては別途記述ガイドがあります。
詳細はこちらを参照して下さい。


呼び出されたサービスでの記述内容

この呼出方法の場合は、呼び出されたサービス側で気をつけるべき事は特にありません。
呼出元から渡される実行時パラメータのセッションキーも、呼出元に返す実行結果のセッションキーも共に任意のキーを指定することが出来ます。



Serviceから他のServiceを実行

サービスの中から別のサービスを直接呼び出したい場合は、callプロセスを使用する形になります。
ただし、このcallプロセスはむやみに使用すると以下のような欠点があります。

  • 処理が階層化するために全体の見通しが悪くなりやすい
  • サービス名を直接指定している密結合の形式なので、呼出サービスの変更が全てに対して影響を及ぼす。
callプロセスを使用する前に、後述するModelEventによる疎結合での呼出 もしくはモデル項目の背後に隠してのProcedureとしての実行が出来ないかをまず検討して下さい。

呼出元での記述内容

サービス内から別のサービスを直接呼び出したい場合はcallプロセスを使用します。

記述例:条件判定して処理を各サービスに振り分ける

;;-------------------------------------
;;入力情報
;; @WKFL_ワークフロー申請データ(Updatable)
;;-------------------------------------
(service
    service_name    各種支払申請書を取込する
    service_location    server
    {process
        (受取がまだだったら受け取りする
            (before_condition
                filter  "@WKFL_ワークフロー申請データ/ワークフロー状態種別 != 受取済"
                error   &Skip
            )
            format_type call
            (call
                service "各種申請書を受取する"
            )
        )
        (出金申請書の場合
            (before_condition
                filter  "@WKFL_ワークフロー申請データ/ワークフロー申請種別 = 出金申請書"
                error   &Skip
            )
            format_type call
            (call
                service "出金申請書を取込する"
            )
        )
        (仮払申請書の場合
            (before_condition
                filter  "@WKFL_ワークフロー申請データ/ワークフロー申請種別 = 仮払申請書"
                error   &Skip
            )
            format_type call
            (call
                service "仮払申請書を取込する"
            )
        )
    }
)
このcallプロセスについては別途記述ガイドがあります。
詳細はこちらを参照して下さい。


呼び出されたサービスでの記述内容

この呼出方法の場合は、呼び出されたサービス側で気をつけるべき事は特にありません。
呼出元から渡される実行時パラメータのセッションキーも、呼出元に返す実行結果のセッションキーも共に任意のキーを指定することが出来ます。



JavaAPIによる呼出で実行

サービスフレームワークの実行エンジンが提供するJavaAPIを使用することで、 サービスをJavaプログラムから呼び出して実行することが出来ます。

呼出元での記述内容

Javaプログラムからサービスを呼び出す場合、以下のようなケースが考えられます。

  • 外部システムとの連携を行うようなプログラムで、受信データを取り込む処理としてサービスを呼び出す。
  • ClientFramework以外の別の仕組みの上でユーザーインタフェースを構築してそこからサービスを呼び出す。
このような場合においては、サービスをトランザクションをかけて実行するためのコンテナとなるEJBを呼び出します。
このEJBは以下のようなJNDI名、Javaインタフェースを持ちます。

JNDI名 CommonServiceFacade
Homeインタフェース pexa.facade.service.CommonServiceFacadeSessionHome
Remoteインタフェース pexa.facade.service.CommonServiceFacadeSession

上記の情報をベースにEJBを呼び出して、以下のメソッドをコールします。

/**
 * 指定したサービスを実行する
 * @param serviceNameKey 呼出すサービスの名前(Key)
 * @param session 実行時パラメータを格納したServiceSession
 * @return 実行結果を格納したServiceSession
 */
public ServiceSession doService(Key serviceNameKey, ServiceSession session)
                        throws ServiceException, FatalException, RemoteException; 
第一引数のserviceNameKeyは、pexa.share.util.Keyというクラスをnewして渡します。
第二引数のsessionは、pexa.share.service.base.ServiceSessionBaseというクラスをnewして、そこに実行時パラメータを格納して渡します。


呼び出されたサービスでの記述内容

この呼出方法の場合は、呼び出されたサービス側で気をつけるべき事は特にありません。
呼出元から渡される実行時パラメータのセッションキーも、呼出元に返す実行結果のセッションキーも共に任意のキーを指定することが出来ます。



ModelFrameworkからProcedureとして実行

ModelFrameworkでモデル項目の背後に隠して呼び出すことが出来るProcedureは実装方法として以下の2通りがあります。

  • Javaプラグインとして作成する方法
  • サービスで作成する方法
ここでは、サービスからのProcedure呼出(実装方法に限らず)についてと、Procedureとして作成されたサービスの記述内容について説明します。
なお、JavaプラグインとしてProcedureを作成するケースについてはここでは扱いません。ModelFrameworkのガイドを参照して下さい。

呼出元での記述内容

サービスからProcedure項目を参照する場合は、基本的にはデータモデルの項目をパス式で通常通りに参照するだけです。 その項目がProcedure項目であるのか、通常のDBカラムとO/Rマッピングされている項目であるかを区別する必要はありません。

記述例:カラム項目かProcedure項目かを意識せずに値を取得する

(モデル項目を参照する
    format_type    session
    (session
        (session_keys
            データモデル項目A    @データモデル/項目A  ;;カラム項目
            データモデル項目B    @データモデル/項目B  ;;Procedure項目
        )
    )
)
上記の例は、Procedure項目と意識せず単に項目として参照しているケースですが、呼出元から実行時パラメータを与えてProcedureを呼び出すことも可能です。
このような場合は、呼出元が対象のデータモデル項目がProcedure項目であると意識して参照しているケースとなります。以下の順で処理します。
  • あらかじめ、PEXA_Conditionというキーで無名モデルをセッション上に登録してパラメータを設定
  • 対象のデータモデル項目を参照してProcedureを呼び出す
このようにすることで、データモデルを間に挟んで呼び出されたProcedureはPEXA_Conditionというキーの無名モデル中に 登録された実行時パラメータを含めた形で呼出元のデータモデルを参照することができるので、そのパラメータを受け取って処理することが出来ます。

記述例:パラメータを渡してProcedureを呼び出す
(Procedureに対するパラメータを作成する
    format_type    mapping
    (mapping
        create    force
        commit    false
        (@PEXA_Condition
            実行パラメータ1    @パラメータ値1
            実行パラメータ2    @パラメータ値2
            実行パラメータ3    @パラメータ値3
        )
    )
)
(Procedure項目を参照する
    format_type    session
    (session
        (session_keys
            データモデル項目B     @データモデル/項目B  ;;Procedure項目
        )
    )
)
上記のような記述での呼出となりますが、 この時PEXA_Conditionという無名モデルに対して設定する実行時パラメータは現象型としてあらかじめ定義されている必要があります。 また、PEXA_Conditionのよる実行時パラメータの受け渡しは、Procedureがサービスで実装されていてもJavaプラグインとして実装されていても可能です。


呼び出されたサービスでの記述内容

サービスで実装されたProcedureは、以下の2つの特殊なセッションキーで値を受け渡しします。

セッションキー 取得できる内容
PEXA_Source Procedureの呼出元であるデータモデル(モデル項目、PEXA_Conditionの項目を全て含む)
PEXA_Return Procedureの処理結果を表す値(=Procedure項目の値)

Procedure実装サービスは、PEXA_Sourceというキーに格納されているデータモデル(=呼出元)から必要な値を取得し、 その値を元に処理を行って結果をPEXA_Returnというキーで返すというのが処理の流れとなります。

この時、PEXA_Sourceから取得できるのは呼出元のデータモデルが持つ項目だけではなく、Procedure項目を参照した呼出元の サービスからPEXA_Conditionというキーで渡された無名モデルに格納されている実行時パラメータも一緒に取得する事が出来ます。

記述例:モデル項目及びPEXA_Conditionの設定項目を取得して処理を実行、値を返す

(PEXA_Sourceから必要な情報を取得
    format_type    session
    (session
        (session_keys
            実行パラメータ1    @PEXA_Source/実行パラメータ1
            実行パラメータ2    @PEXA_Source/実行パラメータ2
            実行パラメータ3    @PEXA_Source/実行パラメータ3
            モデル項目1        @PEXA_Source/モデル項目1
            モデル項目2        @PEXA_Source/モデル項目2
        )
    )
)
(実行パラメータを使用して他のデータを検索
    format_type    search
    (search
        source         他のデータモデル
        session_value  検索結果
        filter         "項目1 = @実行パラメータ1 and 項目2 = @実行パラメータ2 and 項目3 = @実行パラメータ3"
        unique         true
    )
)
(他のデータから値を取得して加算しPEXA_Returnに設定する
    format_type    session
    (session
        (session_keys
            PEXA_Return    &Add:{@検索結果/モデル項目0}{&Add:{@モデル項目1}{@モデル項目2}}
        )
    )
)



ModelEventによる疎結合での呼出で実行

ModelEventは、サービスのsendプロセスで実行エンジンに対して送信することが出来るイベントです。
このイベントに対してModelEventTableを記述して用意することで、イベント通知に対して実行するサービスをマッピングすることが出来ます。
ModelEventTableについては別途記述ガイドが用意されていますので、詳細はこちらを参照して下さい。

これは、サービスから直接サービスを呼び出すcallプロセスを使用すると密結合になってしまうために、 場合によっては影響範囲が多岐に及ぶのを防ぐために用意された仕組みです。

サービスからサービスを呼び出す場合は、極力このModelEventによる仕組みで実現できないかを検討して下さい。

呼出元での記述内容

ModelEventを送信するには、sendプロセスを使用します。
このプロセスで指定したデータモデルをイベントとして実行エンジンに送信することで、ModelEventTableに定義された実行サービスが呼び出されます。

ここで指定するデータモデルは、実際に編集などを行ったデータモデルでも良いですし、無名モデルを指定してパラメータの受け渡しのみに使うことも出来ます。 それぞれは以下のようなケースで使用します。

  • mappingプロセスで登録したデータモデルを指定 : データ登録に伴って連動させる処理を実行する場合
  • 実行パラメータを設定した無名モデルを指定 : バッチ処理的なロジックの固まりになっているサービスを呼び出す場合
ModelEventの仕組みを利用するメリットとしては、以下のようなものがあります。
  • 実行サービスがModelEventTableで隠蔽されているので、呼出元を気にせず実行サービスの入替や追加が可能。
  • ModelEventTableで実行条件を指定できるので、呼び分けるためのサービスなどを作成する必要が無い。
ただし、ModelEventは一方通行での処理となるので、処理結果をsendプロセスで受け取ることは出来ません。
処理結果が必要なケースでは以下の方法を検討して下さい。
  • DBを検索して実行結果などを取得する。検索できるようにモデル、項目、処理内容を検討する。
  • 単一のモデルを処理の起点と出来るならProcedure形式での呼出が出来ないか検討する。
  • callプロセスでの呼出を行う。この場合も間にクッションとなるサービスを挟んで直接呼出を避ける。
記述例:mappingプロセスで登録したデータモデルを指定
(データを登録
    format_type    mapping
    (mapping
        create    false
        commit    true
        (@登録データ:退院Order
            Creator           @Role/UserNo
            CreateDatetime    &Now
        )
    )
)
(退院Orderが登録されたことをイベント通知
    format_type    send
    (send
        table_name    退院Orderイベントテーブル
        operation     CREATE
        source        @登録データ
        sync          true
    )
)
上記のようなケースでは、例えばある患者に対する退院指示(退院Order)が登録されたことをトリガーとして、 患者基本情報に対する更新処理や、退院処方、給食に関する処理を連動して実行すると言った場合に使用されます。

記述例:実行パラメータを設定した無名モデルを指定
(実行時パラメータを無名モデルとして作成
    format_type    mapping
    (mapping
        create    force
        commit    false
        (@払出実行イベント
            払出元部署No        @払出元部署No
            在庫引当実行フラグ  @在庫引当実行フラグ
            入荷払出実行フラグ  @入荷払出実行フラグ
            EntityName          "払出実行イベント"
        )
    )
)
(モデルイベントを送信してバッチ的なロジックの固まりを実行
    format_type    send
    (send
        table_name    払出実行イベントテーブル
        operation     CREATE
        source        @払出実行イベント
        sync          true
    )
)
上記のようなケースでは、複雑かつ複数の処理を条件判定しながら実行するような場合にそれを直接callプロセスなどで サービス間の密結合で呼び出さずに、ModelEventTableを間に挟んで呼び出す形になります。


呼び出されたサービスでの記述内容

ModelEventTableの内容に従って、ModelEventによって呼び出されたサービスは、以下の特殊なセッションキーでパラメーターを受け取ります。

セッションキー 取得できる内容 対応するsendプロセス側のパラメータ
PEXA_ModelEventModel イベント発生元のデータモデルそのものが取得できます。 source属性
PEXA_ModelEventOperationCategory PEXA_ModelEventModelで取得できるデータモデルに対して行われた操作の種別が取得できます。 operation属性

呼び出されたサービスは上記のキーでパラメータを受け取って、処理を実行します。
なお、モデルイベントは一方通行の処理になるため、呼出元に対しての値の返却はありません。
サービス終了時にServiceSession上に設定されているキーと値は全て破棄されます。

記述例:イベントモデルからパラメータを取得

(イベントからパラメータを取得
    format_type    session
    (session
        (session_keys
            払出元部署No        @PEXA_ModelEventModel/払出元部署No
            在庫引当実行フラグ  @PEXA_ModelEventModel/在庫引当実行フラグ
            入荷払出実行フラグ  @PEXA_ModelEventModel/入荷払出実行フラグ
            イベント名          @PEXA_ModelEventModel/EntityName
            操作種別            @PEXA_ModelEventOperationCategory
        )
    )
)



更新情報

  • 最終更新者 : $Author: morishita $
  • 最終更新日時 : $Date:: 2009-11-07 17:19:30 #$
  • バージョン : $Revision: 4347 $



Copyright © 2006, Atrris Corporation