ページの先頭行へ戻る
Interstage Business Application ServerV11.0.0 アプリケーション開発ガイド
Interstage

10.3.4 クライアントアプリケーションの処理の作成

同期アプリケーション連携実行基盤上で動作する業務共通制御と連携させるために必要なクライアントアプリケーションの処理を作成します。
クライアントアプリケーションは、同期アプリケーション連携実行基盤のクライアントAPIを利用して作成します。
クライアントアプリケーションは、一般的なC言語アプリケーションとして作成できます。

C言語アプリケーションからの呼出し

C言語アプリケーションからサーバアプリケーションを呼び出すプログラムの記述例を示します。

使用例

業務処理IDLファイル

module apfw_mod {
    interface apfw_intf {
        string sampleApl(in string p1,inout wstring p2,out string p3);
    };
};

業務共通制御IDLファイル

module apfw_mod {
    interface apfw_intf {
        void sampleCtrl(inout string cp1, inout string cp2);
    };
};

クライアントアプリケーション

#include <stdlib.h>
#include <stdio.h>
#include "apfwcom.h"
#include "apfw_cdr_lib.h"
#include "apfwsccl.h" /* C言語クライアントAPIのヘッダ */
#include "sample_apfwsccl.h"
#include "sample_ctrl_apfwsccl.h"

#define NORMAL_END      0
#define ERROR_END       -1

/* プロセスで1回のみ実施する初期化処理 */
void doInit(){
    apfwScclExcept env;
    if(APFW_SCCL_SUCCESS != apfw_sccl_init(&env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        apfw_sccl_except_free(env);
        abort();
    }
}

/* プロセスで1回のみ実施する終了処理 */
void doTerm(){
    apfwScclExcept env;
    if(APFW_SCCL_SUCCESS != apfw_sccl_term(&env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        apfw_sccl_except_free(env);
        abort();
    }
}

int doSomething(char *p1, unsigned short **p2, char **p3, char **r,char **cp1, char **cp2 ){
    /* ハンドル */
    apfwScclHandle handle;
    /* 送信データ */
    apfwSequenceOctet send_data, send_cdata;
    /* 受信データ */
    apfwSequenceOctet recv_data, recv_cdata;
    /* 例外情報 */
    apfwScclExcept env;
    /* 関数の復帰状態 */
    int             return_code = ERROR_END;

    /* 例外情報初期化 */
    memset( &env, 0, sizeof(apfwScclExcept) );
    /* 送受信データ領域初期化 */
    memset( &send_data, 0, sizeof(apfwSequenceOctet) );
    memset( &send_cdata, 0, sizeof(apfwSequenceOctet) );
    memset( &recv_data, 0, sizeof(apfwSequenceOctet) );
    memset( &recv_cdata, 0, sizeof(apfwSequenceOctet) );

    /*業務名”MyApp”に対するコネクションを確立する*/
    if(APFW_SCCL_SUCCESS != apfw_sccl_create(NULL, "MyApp", &handle, &env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        goto CLEANUP;
    }
    /* コンテキストIDの設定 */
    if(APFW_SCCL_SUCCESS != apfw_sccl_set_contextid(handle, "abcdef", &env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        goto CLEANUP;
    }

    /* 送信用制御データ変換関数 */
    if( APFW_SCCL_SUCCESS != sampleCtrl_encode_data(handle, cp1, cp2, &send_cdata, &env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        goto CLEANUP;
    }

    /* 制御データの設定 */
    if( APFW_SCCL_SUCCESS != apfw_sccl_set_controldata(handle, send_cdata, &env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        goto CLEANUP;
    }

    /* 送信用データ変換関数 */
    if( APFW_SCCL_SUCCESS != sampleApl_encode_data(handle, p1, p2, p3, &send_data, &env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        goto CLEANUP;
    }

    /* サーバアプリケーション呼び出し */
    if( APFW_SCCL_SUCCESS != apfw_sccl_invoke(handle, "apl", send_data, &recv_data, &env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        goto CLEANUP;
    }
    /* INOUTデータの解放 */
    if(*p2 != NULL){
        apfw_c_free(*p2);
        *p2 = NULL;
    }
    /* 受信用データ変換関数 */
    if( APFW_SCCL_SUCCESS != sampleApl_decode_data(handle, &recv_data, r, p1, p2, p3, &env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        goto CLEANUP;
    }

    /* 制御データの取得 */
    if( APFW_SCCL_SUCCESS != apfw_sccl_get_controldata(handle, &recv_cdata, &env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        goto CLEANUP;
    }
    /* 設定用制御データの解放 */
    if(*cp1 != NULL){
        apfw_c_free(*cp1);
        *cp1 = NULL;
    }
    if(*cp2 != NULL){
        apfw_c_free(*cp2);
        *cp2 = NULL;
    }
    /* 受信用制御データ変換関数 */
    if( APFW_SCCL_SUCCESS != sampleCtrl_decode_data(handle, &recv_cdata, cp1, cp2, &env) ){
        fprintf( stderr, "%s\n", env.errmessage );
        goto CLEANUP;
    }
    return_code = NORMAL_END;

CLEANUP:
    /* コネクションの切断 */
    if(handle != NULL){
        apfw_sccl_remove(handle, &env);
    }

    /* 例外情報解放 */
    apfw_sccl_except_free(env);
    /* 送受信データ解放 */
    if ( send_data.val != NULL ){
        apfw_c_free( send_data.val );
    }
    if ( send_cdata.val != NULL ){
        apfw_c_free( send_cdata.val );
    }
    if ( recv_data.val != NULL ){
        apfw_c_free( recv_data.val );
    }
    if ( recv_cdata.val != NULL ){
        apfw_c_free( recv_cdata.val );
    }
    return return_code;
}

/* クライアントアプリケーションで扱うデータの領域の獲得 / 解放を行う関数 */
void call_doSomething(){
    char            *p1 = NULL;
    unsigned short  *p2 = NULL;
    char            *p3 = NULL;
    char            *result = NULL;
    char            *cp1 = NULL;
    char            *cp2 = NULL;

    /* INパラメタ */
    p1 = apfw_c_alloc( 8 );
    if( p1 == NULL ){
        printf("malloc failed\n");
        goto CLEANUP;
    }
    memset(p1, 0x00, 8 );
    strcpy(p1, "IN_DATA");

    /* INOUTパラメタ */
    p2 = apfw_c_alloc( 11 );
    if( p2 == NULL ){
        printf("malloc failed\n");
        goto CLEANUP;
    }
    memset( p2, 0x00, 11 );
    strcpy( p2, "INOUT_DATA" );

    /* 制御データ */
    cp1 = apfw_c_alloc( 11 );
    if( cp1 == NULL ){
        printf("malloc failed\n");
        goto CLEANUP;
    }
    memset(cp1, 0x00, 11 );
    strcpy(cp1, "CTRL_DATA1");

    cp2 = apfw_c_alloc( 11 );
    if( cp2 == NULL ){
        printf("malloc failed\n");
        goto CLEANUP;
    }
    memset( cp2, 0x00, 11 );
    strcpy( cp2, "CTRL_DATA2" );

    /* クライアントアプリの呼び出し */
    if( NORMAL_END != doSomething( p1, &p2, &p3, &result, &cp1, &cp2 ) ){
        printf("call doSomething failed\n");
        goto CLEANUP;
    }
    /* INOUTパラメタの出力 */
    printf("Get IN OUT Data [%02x]\n", p2[0]);
    /* OUTパラメタの出力 */
    printf("Get OUT Data [%s]\n", p3);
    /* 復帰値の出力 */
    printf("Result Data [%s]\n", result);

    /* 制御データの出力 */
    printf("Ctrl Data1 [%s]\n", cp1);
    /* 復帰値の出力 */
    printf("Ctrl Data2 [%s]\n", cp2);

CLEANUP:
    /* INパラメタの解放 */
    if ( p1 != NULL )
        apfw_c_free( p1 );
    /* INOUTパラメタの解放 */
    if ( p2 != NULL )
        apfw_c_free( p2 );
    /* OUTパラメタの解放 */
    if ( p3 != NULL )
        apfw_c_free( p3 );
    /* 復帰値の解放 */
    if ( result != NULL )
        apfw_c_free( result );
    /* 制御データの解放 */
    if ( cp1 != NULL )
        apfw_c_free( cp1 );
    /* 復帰値の解放 */
    if ( cp2 != NULL )
        apfw_c_free( cp2 );
}

処理の手順を以下に示します。その他の手順については業務共通制御を使用しない場合の手順と同様です。

  1. 初期化
    apfw_sccl_init関数は、同期アプリケーション連携実行基盤を呼び出すための初期化を行います。

  2. ハンドルの取得
    apfw_sccl_create関数は、同期アプリケーション連携実行基盤を呼び出すためのハンドルを取得します。

  3. コンテキストIDの設定
    apfw_sccl_set_contextid関数は、コンテキストIDを設定します。

  4. 制御データの設定
    apfw_sccl_set_controldata関数で、制御データを設定します。

  5. サーバアプリケーションの呼出し
    apfw_sccl_invoke関数で、サーバアプリケーションを呼び出します。apfw_sccl_invoke関数の引数に与えたデータとサーバアプリケーション名が、サーバに送信されます。サーバアプリケーションが返した結果とOUT値、INOUT値を格納して返します。
    設定した制御データも、サーバアプリケーションに送信されます。サーバアプリケーションはOUT値、INOUT値の制御データに値を設定して返します。

  6. 制御データの取得
    apfw_sccl_get_controldata関数で、制御データを取得します。

  7. ハンドラの破棄
    apfw_sccl_remove関数は、apfw_sccl_create関数で作成したハンドラの破棄を実行します。

  8. 終了処理
    apfw_sccl_term関数は、同期アプリケーション連携実行基盤C言語クライアントAPIの終了処理を行います。