Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 TP1/Server Base Enterprise Option プログラム作成の手引


サービス関数の作成(SPP)

TP1/EEおよびXTCのUAPのサービス関数の文法について説明します。SPPはサービス関数を作成します。

〈このページの構成〉

形式(TP1/EEの場合)

ANSI C,C++の形式

32ビットアーキテクチャの場合
#include <eerpcsrv.h>
 
void  関数名(char *in, EEULONG *in_len, char *out, EEULONG *out_len,
EERPC_INTERFACE_TBL *trninf)
{
サービスの処理
}
 
/* EERPC_INTERFACE_TBL構造体の形式 */
EERPC_INTERFACE_TBL {
  EEULONG    trn_len;
  EEULONG    group_len;
  char       servicegroup[32];
  EEULONG    service_len;
  char       service[32];
  char       trn_id[2];
  char       auto_block;
  char       commit_inf;
  EEULONG    thread_no;
  EEULONG    err_code;
  EEULONG    uifa_len;
  char       *uifa;
  EEULONG    usat_len;
  char       *usat;
  char       ans_inf;
  char       msg_inf;
  char       start_inf;
  char       before_end_inf;
  char       end_inf;
  char       thread_down_inf;
  char       uap_errtrn_inf;
  char       trninf_ex;
  EEULONG    rm_no;
  EELONG     rm_inf;
  EEULONG    es_group_len;
  char       es_servicegroup[32];
  EEULONG    es_service_len;
  char       es_service[32];
  EEULONG    abn_thread_no;
  union {
    TRNINF_SERVICE_EX     *trninf_service_ex;
    TRNINF_DBQ_EX         *trninf_dbq_ex;
    TRNINF_DBQ_OBS_EX     *trninf_dbq_obs_ex;
  } ex_inf;
  void             *xtc_pt;
  void             *mcp_pt;
  char             msg_type;
  char             errtrn_factor;
  char             run_inf;
  char             rm_func;
  EEULONG          rerun_cnt;
  char             start_time[14];
  char             node_id[5];
  unsigned char    rtyrbk_cnt;
  EEULONG          trnlevel_len;
  char             trnlevel[32];
  char             yobi_ff[24];
  char             rtyrbk_area[32];
  }
 
/* TRNINF_SERVICE_EX構造体の形式 */
TRNINF_SERVICE_EX {
  EEULONG           trn_len;
  EEULONG           service_out_len;
  char              yobi[192];
}
 
/* TRNINF_DBQ_EX構造体の形式 */
TRNINF_DBQ_EX {
  EEULONG           trn_len;
  char              dbqname[28];
  EEULONG           seq_num;
  unsigned short    rollback_cnt;
  char              yobi[162];
}
 
/* TRNINF_DBQ_OBS_EX構造体の形式 */
TRNINF_DBQ_OBS_EX {
  EEULONG           trn_len;
  EEULONG           trn_kind;
  char              batchque_name[28];
  char              lot_name[24];
  EEULONG           cont_size;
  char              *cont_pt;
  EEULONG           lot_type;
  EEULONG           write_event_num;
  EEULONG           seq_num;
  EEULONG           end_code;
  EEULONG           sts_code;
  EEULONG           read_num;
  EEULONG           skip_num;
  EEULONG           unread_count;
  char              msglen_inf;
  char              yobi[99];
}
64ビットアーキテクチャの場合
#include <eerpcsrv.h>
 
void  関数名(char *in, EEULONG *in_len, char *out, EEULONG *out_len,
EERPC_INTERFACE_TBL *trninf)
{
サービスの処理
}
 
/* EERPC_INTERFACE_TBL構造体の形式 */
EERPC_INTERFACE_TBL {
  EEULONG    trn_len;
  EEULONG    group_len;
  char       servicegroup[32];
  EEULONG    service_len;
  char       service[32];
  char       trn_id[2];
  char       auto_block;
  char       commit_inf;
  EEULONG    thread_no;
  EEULONG    err_code;
  EEULONG    uifa_len;
  char       yobi_1[4];
  char       *uifa;
  EEULONG    usat_len;
  char       yobi_2[4];
  char       *usat;
  char       ans_inf;
  char       msg_inf;
  char       start_inf;
  char       before_end_inf;
  char       end_inf;
  char       thread_down_inf;
  char       uap_errtrn_inf;
  char       trninf_ex;
  EEULONG    rm_no;
  EELONG     rm_inf;
  EEULONG    es_group_len;
  char       es_servicegroup[32];
  EEULONG    es_service_len;
  char       es_service[32];
  EEULONG    abn_thread_no;
  EEULONG    trnlevel_len;
  union {
    TRNINF_SERVICE_EX     *trninf_service_ex;
    TRNINF_DBQ_EX         *trninf_dbq_ex;
    TRNINF_DBQ_OBS_EX     *trninf_dbq_obs_ex;
  } ex_inf;
  void             *xtc_pt;
  void             *mcp_pt;
  char             msg_type;
  char             errtrn_factor;
  char             run_inf;
  char             rm_func;
  EEULONG          rerun_cnt;
  EEULONG64        uifa_large_len;
  EEULONG64        usat_large_len;
  char             start_time[14];
  char             node_id[5];
  unsigned char    rtyrbk_cnt;
  char             trnlevel[32];
  char             yobi_ff[4];
  char             rtyrbk_area[32];
  }
 
/* TRNINF_SERVICE_EX構造体の形式 */
TRNINF_SERVICE_EX {
  EEULONG           trn_len;
  EEULONG           service_out_len;
  char              yobi[192];
}
 
/* TRNINF_DBQ_EX構造体の形式 */
TRNINF_DBQ_EX {
  EEULONG           trn_len;
  char              dbqname[28];
  EEULONG           seq_num;
  unsigned short    rollback_cnt;
  char              yobi[162];
}
 
/* TRNINF_DBQ_OBS_EX構造体の形式 */
TRNINF_DBQ_OBS_EX {
  EEULONG           trn_len;
  EEULONG           trn_kind;
  char              batchque_name[28];
  char              lot_name[24];
  EEULONG           cont_size;
  char              *cont_pt;
  char              yobi_1[4];
  EEULONG           lot_type;
  EEULONG           write_event_num;
  EEULONG           seq_num;
  EEULONG           end_code;
  EEULONG           sts_code;
  EEULONG           read_num;
  EEULONG           skip_num;
  EEULONG           unread_count;
  char              msglen_inf;
  char              yobi[91];
}

形式(XTCの場合)

ANSI C,C++の形式

64ビットアーキテクチャの場合
#include <eerpcsrv.h>
 
void  関数名(char *in, EEULONG *in_len, char *out, EEULONG *out_len,
EERPC_INTERFACE_TBL *trninf)
{
サービスの処理
}
 
/* EERPC_INTERFACE_TBL構造体の形式 */
  EERPC_INTERFACE_TBL {
  EEULONG    trn_len;
  EEULONG    group_len;
  char       servicegroup[32];
  EEULONG    service_len;
  char       service[32];
  char       trn_id[2];
  char       auto_block;
  char       commit_inf;
  EEULONG    thread_no;
  EEULONG    err_code;
  EEULONG    uifa_len;
  char       yobi_1[4];
  char       *uifa;
  EEULONG    usat_len;
  char       yobi_2[4];
  char       *usat;
  char       ans_inf;
  char       msg_inf;
  char       start_inf;
  char       before_end_inf;
  char       end_inf;
  char       thread_down_inf;
  char       uap_errtrn_inf;
  char       trninf_ex;
  EEULONG    rm_no;
  EELONG     rm_inf;
  EEULONG    es_group_len;
  char       es_servicegroup[32];
  EEULONG    es_service_len;
  char       es_service[32];
  EEULONG    abn_thread_no;
  char       yobi_3[4];
  union {
    TRNINF_SERVICE_EX     *trninf_service_ex;
  } ex_inf;
  void       *xtc_pt;_
  void       *mcp_pt;_
  char       msg_type;
  char       errtrn_factor;
  char       yobi_4[6];
  EEULONG64  uifa_large_len;
  EEULONG64  usat_large_len;
  char       yobi_ff[56];
  }
 
/* TRNINF_SERVICE_EX構造体の形式 */
TRNINF_SERVICE_EX {
  EEULONG           trn_len
  EEULONG           service_out_len;
  char              yobi[192];
}
 
/* TRNINF_SERVICE_XTC構造体の形式 */
TRNINF_SERVICE_XTC {
  EEULONG           xtc_trn_len;
  char              system_inf;
  char              pre_online_inf;
  char              otq_auto_block;
  char              otq_auto_block_level;
  EEULONG           otq_number;
  EEULONG           err_code_ex;
  EEULONG           itq_number;
  unsigned short    rollback_cnt;
  char              online_inf;
  char              yobi_xx[169];
}

機能

サービスを実行して結果を返すSPPのサービス関数です。クライアントUAPでee_rpc_call関数やee_rpc_cmtsend関数を呼び出したとき,TP1/EEプロセスの開始・終了などによってトランザクションが発生したとき,DBキュー機能でキューを読み込んだときに呼び出されます。サービス関数は,上記の形式で任意に作成してください。

サービス関数名は,サービス関数のエントリポイント(入り口点)の名称に対応します。この対応づけは,UAPの実行環境を設定するときに指定します。UAPの実行環境を設定する方法を次に示します。

引数の指定

サービス関数には,次の値が引数として渡されます。

入力パラメタと入力パラメタの長さはクライアントUAPで設定した値が,文字コードや数字の表現形式などを変換しないでサービス関数にそのまま渡されます。応答の長さには,クライアントUAPで設定した長さが渡されます。

ERRTRNRによるRPC応答メッセージ送信機能を使用している場合で,拡張トランザクション種別がEERPC_SERVICE_TRN_EXのときは,次のようになります。

サービス関数に値が渡される引数を次の表に示します。

表4‒1 サービス関数に値が渡される引数

引数

トランザクション種別

MI

ME

MN

E1

E2

E3

E4

ES

ER

TM

UI

MV

RL

入力パラメタ

×

×

×

×

×

入力パラメタ長

×

×

×

×

×

サービス関数の応答

×

×

×

×

×

×

×

×

×

×

×

×

応答の長さ

×

×

×

×

×

×

×

×

トランザクションインタフェース情報

(凡例)

○:参照できます。

×:参照できません。

注※

ERRTRNRによるRPC応答メッセージ送信機能を使用している場合で,拡張トランザクション種別がEERPC_SERVICE_TRN_EXのときだけ参照できます。

サービス関数では,次の値を引数に設定します。

サービス関数は,outに応答を設定して,その長さをout_lenに設定してからリターンしてください。

サービスのクライアントUAPへの応答は,サービス関数がコミットしたかロールバックしたかには無関係に送信されます。必要であればサービス関数でクライアントUAPにエラーを知らせる応答を作成してください。

クライアントUAPから値が渡される引数

●in

クライアントUAPで設定した,入力パラメタが渡されます。

ただし,トランザクション種別がE4,ES,またはTMの場合は次の表に示す値が渡されます。

表4‒2 トランザクション種別がE4,ES,またはTMの場合に渡される値(in)

トランザクション種別

渡される値

E4

ee_tim_execap関数が起動するトランザクションに渡すデータ(data)に設定した値

ES

トランザクションと同期して送信する非同期型のメッセージ送信API(ee_rpc_cmtsend関数など)の入力パラメタ(in)に設定した値

TM

ee_tim_execap関数が起動するトランザクションに渡すデータ(data)に設定した値

●in_len

クライアントUAPで設定した,入力パラメタの長さが渡されます。

ただし,トランザクション種別がE4,ES,またはTMの場合は次の表に示す値が渡されます。

表4‒3 トランザクション種別がE4,ES,またはTMの場合に渡される値(in_len)

トランザクション種別

渡される値

E4

ee_tim_execap関数が起動するトランザクションに渡すデータ(dataleng)に設定した値

ES

トランザクションと同期して送信する非同期型のメッセージ送信API(ee_rpc_cmtsend関数など)の入力パラメタ(in_len)に設定した値

TM

ee_tim_execap関数が起動するトランザクションに渡すデータ(dataleng)に設定した値

●out_len

クライアントUAPで設定した,応答の長さが渡されます。

TP1/EEから値が返される引数

●trninf

トランザクションインタフェース情報が返されます。詳細については,この章の「トランザクションインタフェース情報」を参照してください。

●TRNINF_SERVICE_XTC

XTC拡張トランザクションインタフェース情報が返されます。この章の「トランザクションインタフェース情報」を参照してください。

UAPで値を設定する引数

●out

サービス関数からの応答を設定します。サービス関数の処理では,outにサービス関数での処理結果を設定してからリターンしてください。

●out_len

サービス関数からの,実際の応答の長さを設定します。クライアントUAPから渡されたout_lenの値以下の数値を設定してください。応答不要(非応答型RPC)の場合は,0を設定してください。

サービス関数の処理での注意

  1. クライアントから応答不要で呼び出されるサービス関数では,outとout_lenは参照できません。クライアントから応答不要で呼び出されるサービス関数を次に示します。

    • 非応答型RPCで呼び出されるRPCのサービス関数

    • DBキューのサービス関数

    • オンラインバッチのサービス関数

  2. サービス関数をC言語で記述した場合は,static変数には前回のサービス要求時の値が残っているので,必要であれば初期化してから使用してください。

  3. サービス関数ではexit(),fork(),exec()を使わないでください。これらの関数を使った場合のUAPの動作は保証されません。

トランザクションとサービス関数の関係

グローバルトランザクションのサービス全体は,コミットするかロールバックとなるかのどちらかが保証されています。トランザクションブランチとして実行されるサービス関数がリターン(return)することで,そのトランザクションブランチの正常終了を要求したと見なされます。

リターン値

リターン値はありません。return()で指定した値はクライアントUAPには返りません。TP1/EEでもリターン値を参照しません。リターン値として-1を指定しても,ロールバックを要求したことにはなりません。