4.10 OpenTP1のアプリケーションプログラムの作成

ここでは,C言語でプログラムを作成する場合を例にして,TP1インバウンドアダプタを呼び出すアプリケーションプログラムの作成について説明します。

OpenTP1のアプリケーションプログラムからのTP1インバウンドアダプタの呼び出しは,dc_rpc_call関数を使用します。dc_rpc_call関数の各引数に指定する値を次の表に示します。

表4-13 dc_rpc_call関数の引数に指定する値

引数指定する値
groupTP1インバウンドアダプタのConnector属性ファイルの<service_group>タグで定義したサービスグループ名を指定します。
serviceMessage-driven Bean(サービス)のActivationSpecの<service>タグで定義したサービス名を指定します。
inサービスの入力パラメタを指定します。詳細は,マニュアル「OpenTP1 プログラム作成の手引」を参照してください。
in_lenサービスの入力パラメタ長を指定します。詳細は,マニュアル「OpenTP1 プログラム作成の手引」を参照してください。
out応答を格納する領域を指定します。詳細は,マニュアル「OpenTP1 プログラム作成の手引」を参照してください。
out_len応答の長さを指定します。詳細は,マニュアル「OpenTP1 プログラム作成の手引」を参照してください。
flagsRPCの形態を指定します。指定可能な値については「4.12.3 トランザクションの設定」を参照してください。

 

コーディング例は,トランザクション連携機能を使用しない場合と,トランザクション連携機能を使用する場合の2種類があります。

TP1インバウンドアダプタを呼び出すアプリケーションのSUPのコーディング例を次に示します。なお,この例はSUP固有のもので,SPP,MHPには該当しません。

●トランザクション連携機能を使用しない場合のコーディング例

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dcrpc.h>
#include <dctrn.h>
#include <dcadm.h>

main ()
{

 static char    in_buf[1024];
 static DCLONG  in_buf_len;
 static char    out_buf[1024];
 static DCLONG  out_buf_len;
 int rc;

 rc = dc_rpc_open(DCNOFLAGS);
 if (rc != DC_OK) {
   printf("SUP01:dc_rpc_openに失敗しました。CODE = %d¥n", rc);
   goto PROG_END;
 }
 
 rc = dc_adm_complete(DCNOFLAGS);
 if (rc != DC_OK) {
   printf("SUP01:dc_adm_completeに失敗しました。CODE = %d¥n", rc);
   goto PROG_END;
 }
 
 strcpy(in_buf, "SUP01:DATA OpenTP1!!");
 in_buf_len = strlen(in_buf) + 1;
 out_buf_len = 1024;
 rc = dc_rpc_call("spp01grp", "svr01", in_buf, &in_buf_len, out_buf,
     &out_buf_len, DCNOFLAGS | DCRPC_TPNOTRAN);
 if (rc != DC_OK) {
   printf("SUP01:サービス要求に失敗しました。CODE = %d¥n", rc);
 }
 printf("SUP01:SERVICE FUNCTION RETURN = %s¥n", out_buf);
 
 PROG_END:
 dc_rpc_close(DCNOFLAGS);
 printf("SUP01:処理を終了しました。¥n");
 exit(0);
}

●トランザクション連携機能を使用する場合のコーディング例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dcadm.h>
#include <dcrpc.h>
#include <dctrn.h>

main()
{

 static char     in_buf[1024];
 static DCULONG  in_buf_len;
 static char     out_buf[1024];
 static DCULONG  out_buf_len;
 int rc;

 rc = dc_rpc_open(DCNOFLAGS);
 if (rc != DC_OK) {
   printf("SUP01:dc_rpc_openに失敗しました。CODE = %d¥n", rc);
   goto PROG_END;
 }

 rc = dc_adm_complete(DCNOFLAGS);
 if (rc != DC_OK) {
   printf("SUP01:dc_adm_completeに失敗しました。CODE = %d¥n", rc);
   goto PROG_END;
 }

 rc = dc_trn_begin();
 if (rc != DC_OK) {
   printf("SUP01:dc_trn_beginに失敗しました。CODE = %d¥n", rc);
   goto TRAN_END;
 }

 strcpy(in_buf, "SUP01:DATA OpenTP1!!");
 in_buf_len = strlen(in_buf) + 1;
 out_buf_len = 1024;
 rc = dc_rpc_call("spp01grp", "svr01", in_buf, &in_buf_len, out_buf,
                 &out_buf_len, DCNOFLAGS);
 if (rc != DC_OK) {
   printf("SUP01:サービス要求に失敗しました。CODE = %d¥n", rc);
   goto TRAN_END;
 }
 printf("SUP01:SERVICE FUNCTION RETURN = %s¥n", out_buf);

 TRAN_END:
 rc = dc_trn_unchained_commit();
 if (rc != DC_OK) {
   printf("SUP01:dc_trn_unchained_commitに失敗しました。CODE = %d¥n", rc);
 }

 PROG_END:
 dc_rpc_close(DCNOFLAGS);
 printf("SUP01:処理を終了しました。¥n");
 exit(0);
}