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

18.2.1 サーバアプリケーションでの利用

サーバアプリケーションで高信頼性ログを出力するための開発方法を以下に示します。

ポイント

非同期アプリケーション連携実行基盤の業務処理開始アプリケーション、および同期アプリケーション連携実行基盤のクライアントアプリケーションの中でログを出力する場合は、フレームワークのApcoordinatorのアプリケーションとしてアプリケーションを作成する必要があります。
作成方法およびログ出力先の定義方法については、“フレームワークオンラインマニュアル”を参照してください。

管理名の設定

サーバアプリケーション内で使用する高信頼性ログの管理名を設定します。

ログを出力するサーバアプリケーションに任意の管理名を設定し、ログ出力を行うように作成してください。

アプリケーションが複数あり、それぞれのアプリケーションで定義を分ける場合は、異なる管理名を割り当ててください。

ひとつのアプリケーションの中で用途に応じて複数のログ定義を分ける場合は、ひとつのアプリケーションの中に複数の管理名を設定してください。

また、すべてのアプリケーションで共通定義でのログ運用を行う場合は、すべてのアプリケーションで共通の管理名を設定してください。

Java APIを利用して任意の文字列を出力する

サーバアプリケーションをアプリケーション連携実行基盤固有機能利用クラス(FrameworkApplication)を継承して作成します。
作成したサーバアプリケーション内で、高信頼性ログを出力する手順は以下のとおりです。

  1. getApplicationContextメソッドにより、アプリケーション連携実行基盤コンテキストクラス(ApplicationContext)のオブジェクトを取得します。

  2. 取得したアプリケーション連携実行基盤コンテキストクラスの高信頼性ログ出力クラス取得メソッド(getULogComposer)を発行し、高信頼性ログ出力クラスのオブジェクト(ULogComposer)を取得します。
    この際、ログ定義ファイルに定義した管理名をメソッドのパラメタとして渡します。

  3. 取得した高信頼性ログ出力クラスオブジェクト(ULogComposer)のメソッドを利用してログを出力します。

ポイント

  • ULogComposerを使用してログ書込みを行った場合、printlnメソッドで指定したログ(ユーザログレコード)以外に、トランザクション情報レコードが書き込まれます。トランザクション情報レコードは、そのトランザクションでユーザログレコードの出力を行ったあとに、トランザクションが完了した場合に出力されます。
    トランザクションは、コミットまたはロールバックといった完了操作が行われた場合、または、コネクションが切断された場合に完了します。トランザクションの完了操作により、業務データベースの操作をトランザクション情報レコードに記録することが可能です。業務データベースと同じコネクションを用いた場合は、業務データベースのトランザクションに連動した情報が出力できます。
    なお、トランザクションの完了をせずにコネクションが切断された場合には暗黙のロールバックが発行されたものと見なしロールバック完了のトランザクション情報レコードが出力されます。
    トランザクション情報レコードの構造やその具体的な利用方法については、“Interstage Business Application Server 運用ガイド(高信頼性ログ編)”の“ユーザログテーブルの運用”を参照してください。

  • ユーザログレコードは以下のどれかのタイミングで確定されます。

    • ULogComposerオブジェクトのsyncメソッドまたはcloseメソッドが呼び出されたとき。

    • ULogComposerオブジェクトの取得に使用したConnectionオブジェクトのcommitメソッド、rollbackメソッドまたはcloseメソッドが呼び出されたとき。

    • トランザクションが完了しないでコネクションが切断されたとき。

getULogComposer(高信頼性ログ出力クラス取得メソッド)およびgetApplicationContext(ApplicationContextオブジェクト取得メソッド)については、“Interstage Business Application Server リファレンス”を参照してください。

以下に、高信頼性ログを出力する場合のログ定義ファイルとサーバアプリケーションの記述例を示します。

《ログ定義ファイルの記述例》

<?xml version="1.0" encoding="UTF-8"?>
<logConfig>
  <config> <version>7.1</version> </config>
  <ulog name="ULog1" class="my.sample.MyULogComposer">
      <param name="schema" value="MYSCHEMA"/>   <!-- スキーマ名 -->
      <param name="table" value="ULOG01"/>      <!-- 表名 -->
  </ulog>
</logConfig>

《サーバアプリケーションの記述例》

import java.sql.Connection;
import com.fujitsu.interstage.apfw.application.ApplicationContext;
import com.fujitsu.interstage.apfw.application.FrameworkApplication;
import com.fujitsu.uji.ulog.ULogComposer;

/**
 * サンプルクラス
 */
public class MyApp extends FrameworkApplication {
    /**
     * サンプルメソッド
     */
    public void method1() {
        // JNDI環境の設定
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, 
                "com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory");
        env.put(Context.PROVIDER_URL, "SYM:// ・・・ ");
        InitialContext ctx = null;
        DataSource ds = null;
        Connection connection = null; 
        try {
            ctx = new InitialContext(env);
            ds = (DataSource)ctx.lookup("jdbc/ ・・・ "); 
            connection = ds.getConnection();
            // アプリケーション連携実行基盤コンテキストクラスから
            // 高信頼性ログ出力クラスを取得します
            ApplicationContext context = getApplicationContext();
            ULogComposer myLogger = context.getULogComposer("ULog1", connection); 
            if(myLogger != null){ 
                // 指定のコネクションを利用してデータベースへ出力します
               myLogger.println(null, null, "someMethod start");
            }
            else{
                // 高信頼性ログ出力クラスのオブジェクトがnullのため、
                // ログの出力ができません
                ・・・
            }
            // 高信頼性ログの出力を終了する場合に、クローズをします
            myLogger.close();
            // コネクションをクローズします。
            connection.close()
        } catch(Exception exp) {
            // 例外の処理を行います。
            ・・・
        }
    }
}

注意

高信頼性ログを利用する場合、データベースリソースの取得はSymfowareのJDBCネーミングサービスを使用してください。

データベースリソースの登録はsymjddefdsコマンドまたはデータベースリソース登録ツールを使用します。詳細は“Interstage Business Application Server セットアップガイド”の“SymfowareのJDBC環境の設定”を参照してください。

データベースリソースの取得はJNDI環境を指定したInitialContextから行います。JNDI APIを使用して下記の形式で指定します。

Hashtable env = new Hashtable(); 
env.put(Context.INITIAL_CONTEXT_FACTORY,<factory_class_name>);
env.put(Context.PROVIDER_URL,<provider_url>);
InitialContext ctx = new InitialContext(env);

<factory_class_name>

サービスプロバイダのクラス名にcom.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactoryを指定します。省略することはできません。

<provider_url>

サービスプロバイダがネーミングサービスにアクセスするためのURLを指定します。省略することはできません。
記述形式は以下のとおりです。

SYM://<host>[:<port_no>]

<host>

ネーミングサービスが動作しているサーバのホスト名またはIPアドレスを指定します。省略することはできません。

<port_no>

ネーミングサービスに接続する際のポート番号を指定します。
省略した場合、10326になります。

C言語またはCOBOLサーバアプリケーションから任意の文字列を出力する

作成したサーバアプリケーション内で、高信頼性ログを出力する手順は以下のとおりです。

  1. apfw_log_uopen関数により、高信頼性ログの環境を開設します。

  2. 取得したハンドルを利用して、apfw_log_uprintText関数により高信頼性ログを出力します。

  3. apfw_log_uclose関数により、高信頼性ログの環境を閉鎖します。

注意

データベースアクセス管理機能と同じコネクションを利用する場合は、アプリケーションでコネクションやトランザクションに関する操作を行わないでください。アプリケーションで、コネクションの操作やトランザクションの操作を行った場合の動作については、保証できません。

ポイント

C言語 APIを呼び出す前に、あらかじめデータベースと接続する必要があります。データベースとの接続は、SQL文で実行します。
また、呼び出し後に、コミット、およびデータベースとの切断をする必要があります。コミット、およびデータベースとの切断は、SQL文で実行します。
なお、トランザクション情報レコードの構造やその具体的な利用方法については、“Interstage Business Application Server 運用ガイド(高信頼性ログ編)”の“ユーザログテーブルの運用”を参照してください。
使用するアプリケーションがCOBOLの場合、C言語APIは小文字で作成しているため、プログラムの先頭に“@OPTIONS ALPHAL(WORD)”を記述してください。

apfw_log_uopen(高信頼性ログの環境を開設)、apfw_log_uprintText(高信頼性ログ出力)、およびapfw_log_uclose(高信頼性ログの環境を閉鎖)については、“Interstage Business Application Server リファレンス”を参照してください。

以下に、高信頼性ログを出力する場合の、ログ定義ファイルとサーバアプリケーションの記述例を示します。

《ログ定義ファイルの記述例》

<?xml version="1.0" encoding="UTF-8"?>
<logConfig>
  <config> <version>7.1</version> </config>
  <ulog name="ULog1">
      <param name="schema" value="MYSCHEMA"/>   <!-- スキーマ名 -->
      <param name="table" value="ULOG01"/>      <!-- 表名 -->
  </ulog>
</logConfig>

《C言語サーバアプリケーションの記述例》

#include <stdio.h>
#include <string.h>
#include "apfwlog.h"
#include "sqlrdbei.h"

/**
* 関数
**/
void method1()
{
EXEC SQL BEGIN DECLARE SECTION;
    char      SQLSTATE[6];
    char      SQLMSG[256];
    VARCHAR   server_name[32]; /* サーバ名を格納 */
    VARCHAR   user_name[32];   /* ユーザIDを格納 */
    VARCHAR   db_name[32];     /* データベース名を格納 */
EXEC SQL END DECLARE SECTION;
    APFW_LOG_HANDLE    handle = -1;
    char       printText[32] = "TEST_MESSAGE"; /* 出力するログを格納 */
    char       c_serverName[32] = "TEST_SERVER"; /* サーバ名を格納 */
    char       c_userName[32] = "USER/PASSWORD"; /* ユーザID/パスワードを格納 */
    char       c_dbName[32] = "TEST_DB"; /* データベース名を格納 */
    int        result;

    /* サーバ名を設定します。 */
    strcpy(server_name.sqlvar,c_serverName);
    server_name.sqllen = strlen(c_serverName);
    /* ユーザID/パスワードを設定します。 */
    strcpy(user_name.sqlvar,c_userName);
    user_name.sqllen = strlen(c_userName);
    /* データベース名を設定します。 */
    strcpy(db_name.sqlvar,c_dbName);
    db_name.sqllen = strlen(c_dbName);

    /* データベースと接続します。 */
    EXEC SQL CONNECT TO :server_name AS :db_name USER :user_name;
    if(strcmp(SQLSTATE,"00000")!=0){
        /* 接続失敗 */
        return;
    }

    /* 高信頼性ログの環境を開設 */
    handle = apfw_log_uopen("ULog1",SQL_U_CURRENT_CON);
    if(handle<0){
        /* 環境の開設に失敗 */
        EXEC SQL DISCONNECT CURRENT;
        return;
    }

    /* データベースへ出力 */
    result = apfw_log_uprintText(handle,NULL,NULL,printText);
    if(result!=APFWLOGNORMAL){
        /* 出力失敗 */
    }

    /* 高信頼性ログの環境の閉鎖 */
    result = apfw_log_uclose(handle);
    if(result!=APFWLOGNORMAL){
        /* 環境の閉鎖に失敗 */
    }

    /* コミット処理 */
    EXEC SQL COMMIT WORK;

    /* データベースと切断します。 */
    EXEC SQL DISCONNECT CURRENT;

    return;
}

《COBOLサーバアプリケーションの記述例》

000001 @OPTIONS ALPHAL(WORD)
000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. "METHOD1".
000030 DATA DIVISION.
000040 WORKING-STORAGE SECTION.
000050 01 COMPOSERNAME PIC X(20).
000060 01 HANDLE        PIC S9(18) COMP-5.
000070 01 CONNECTNAME   PIC X(20).
000080 01 RET           PIC S9(9) COMP-5.
000090 01 TEXT_MSG PIC X(32).
000100 01 TEXT_VALUE PIC S9(9) COMP-5.
000110     EXEC SQL BEGIN DECLARE SECTION END-EXEC.
000120 01 SQLSTATE        PIC X(5).
000130 01 SQLMSG          PIC X(128).
000140     EXEC SQL END DECLARE SECTION END-EXEC.
000150 LINKAGE SECTION.
000160 COPY APFW_EXCEPTION.
000170 01 RTN       PIC S9(9) COMP-5.
000180 PROCEDURE DIVISION USING RTN
000190                          APFW_EXCEPTION.
000200
000210*=====================================================
000220*   データベースに接続します
000230*=====================================================
000240     EXEC SQL CONNECT TO 'TEST_SERVER' AS 'TEST_DB' USER ' USER/PASSWORD' END-EXEC.
000250     IF SQLSTATE NOT = "00000" THEN
000260       DISPLAY "CONNETCT NG"
000270       DISPLAY SQLSTATE
000280       DISPLAY SQLMSG
000290     END-IF.
000300
000310*=====================================================
000320*   高信頼性ログの環境を開設します
000330*=====================================================
000340     MOVE "ULog01" & X"00" TO COMPOSERNAME.
000350     MOVE "TEST_DB" & X"00" TO CONNECTNAME.
000360     CALL "apfw_log_uopen" USING BY REFERENCE COMPOSERNAME
000370                                 BY REFERENCE CONNECTNAME
000380                           RETURNING HANDLE.
000390     IF HANDLE < 0
000400       DISPLAY "apfw_log_uopen error"
000410     END-IF.
000420
000430*=====================================================
000440*   データベースへ出力します
000450*=====================================================
000460     MOVE "TEST_MESSAGE" & X"00" TO TEXT_MSG.
000470     MOVE 0 TO TEXT_VALUE.
000480     CALL "apfw_log_uprintText" USING BY VALUE HANDLE
000490                                      BY VALUE TEXT_VALUE
000500                                      BY VALUE TEXT_VALUE
000510                                      BY REFERENCE TEXT_MSG
000520                                RETURNING RET.
000530     IF RET NOT = 0
000540       DISPLAY "apfw_log_printText error"
000550     END-IF.
000560
000570*====================================================
000580*   高信頼性ログの環境を閉鎖します
000590*====================================================
000600	   CALL "apfw_log_uclose" USING BY VALUE HANDLE
000610                            RETURNING RET.
000620     IF RET NOT = 0
000630	     DISPLAY "apfw_log_uclose error"
000640     END-IF.
000650
000660*=====================================================
000670*   コミットします
000680*=====================================================
000690     EXEC SQL COMMIT WORK END-EXEC.
000700
000710*=====================================================
000720*   データベースとの接続を切断します
000730*=====================================================
000740     EXEC SQL DISCONNECT CURRENT END-EXEC.
000750
000760 END PROGRAM "METHOD1".