サービス関数の作成(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の実行環境を設定する方法を次に示します。
-
TP1/EEおよびXTCの場合
ユーザサービス関連定義で指定します。
引数の指定
サービス関数には,次の値が引数として渡されます。
-
入力パラメタ(in)
-
入力パラメタ長(in_len)
-
応答の長さ(out_len)
-
トランザクションインタフェース情報(trninf)
入力パラメタと入力パラメタの長さはクライアントUAPで設定した値が,文字コードや数字の表現形式などを変換しないでサービス関数にそのまま渡されます。応答の長さには,クライアントUAPで設定した長さが渡されます。
ERRTRNRによるRPC応答メッセージ送信機能を使用している場合で,拡張トランザクション種別がEERPC_SERVICE_TRN_EXのときは,次のようになります。
-
ERRTRNRのサービス関数には,次の値が引数として渡されます。
-
入力パラメタ(in)
-
入力パラメタ長(in_len)
-
サービス関数の応答(out)
-
サービス関数で設定した応答の長さ(out_len)
-
トランザクションインタフェース情報(trninf)
-
-
ERRTRNRのサービス関数の応答には,サービス関数でクライアントUAPが設定したサービス関数の応答(out),およびサービス関数で設定した応答の長さ(out_len)が渡されます。
サービス関数に値が渡される引数を次の表に示します。
サービス関数では,次の値を引数に設定します。
-
サービス関数の応答(out)
-
サービス関数の応答の長さ(out_len)
サービス関数は,outに応答を設定して,その長さをout_lenに設定してからリターンしてください。
サービスのクライアントUAPへの応答は,サービス関数がコミットしたかロールバックしたかには無関係に送信されます。必要であればサービス関数でクライアントUAPにエラーを知らせる応答を作成してください。
クライアントUAPから値が渡される引数
●in
クライアントUAPで設定した,入力パラメタが渡されます。
ただし,トランザクション種別がE4,ES,またはTMの場合は次の表に示す値が渡されます。
トランザクション種別 |
渡される値 |
---|---|
E4 |
ee_tim_execap関数が起動するトランザクションに渡すデータ(data)に設定した値 |
ES |
トランザクションと同期して送信する非同期型のメッセージ送信API(ee_rpc_cmtsend関数など)の入力パラメタ(in)に設定した値 |
TM |
ee_tim_execap関数が起動するトランザクションに渡すデータ(data)に設定した値 |
●in_len
クライアントUAPで設定した,入力パラメタの長さが渡されます。
ただし,トランザクション種別がE4,ES,またはTMの場合は次の表に示す値が渡されます。
トランザクション種別 |
渡される値 |
---|---|
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を設定してください。
サービス関数の処理での注意
-
クライアントから応答不要で呼び出されるサービス関数では,outとout_lenは参照できません。クライアントから応答不要で呼び出されるサービス関数を次に示します。
-
非応答型RPCで呼び出されるRPCのサービス関数
-
DBキューのサービス関数
-
オンラインバッチのサービス関数
-
-
サービス関数をC言語で記述した場合は,static変数には前回のサービス要求時の値が残っているので,必要であれば初期化してから使用してください。
-
サービス関数ではexit(),fork(),exec()を使わないでください。これらの関数を使った場合のUAPの動作は保証されません。
トランザクションとサービス関数の関係
グローバルトランザクションのサービス全体は,コミットするかロールバックとなるかのどちらかが保証されています。トランザクションブランチとして実行されるサービス関数がリターン(return)することで,そのトランザクションブランチの正常終了を要求したと見なされます。
リターン値
リターン値はありません。return()で指定した値はクライアントUAPには返りません。TP1/EEでもリターン値を参照しません。リターン値として-1を指定しても,ロールバックを要求したことにはなりません。