ページの先頭行へ戻る
Interstage Service Integrator V9.5.0 アプリケーション開発ガイド
FUJITSU Software

D.3.5 ローカルDBとのトランザクション機能の利用

例をもとに、ローカルDBとのトランザクション機能を利用したアプリケーションの開発手順を説明します。

アプリケーションの開発は、以下の手順で行います。

図D.12 開発の手順

前提

サービスエンドポイント名:endpointJMSRIN、endpointJMSROUT
DBの種類:Symfoware Server
DBの接続先:jdbc:symford://isiserv:2050/ESIMESSAGEDB

DBのユーザID:UID
DBのパスワード:PWD

手順

  1. サービスエンドポイント定義を作成します。
    メッセージ送受信APIを利用するためのサービスエンドポイント定義にサービスエンドポイント名“endpointJMSRIN”と“endpointJMSROUT”を定義します。
    作成方法については、“ISI Studio ヘルプ”を参照してください。

  2. ローカルDBと接続します。
    ローカルDBと接続し、自動コミットをオフにします。
    接続先のDBは、環境に合わせて変更してください。

  3. 手順1で作成したサービスエンドポイント名をパラメタに設定し、通信制御クラス(ESIService)を生成します。

  4. トランザクション制御クラス(ESILocalTransaction)を生成します。手順2で作成したローカルDBとの接続情報をパラメタに設定します

  5. 共通メッセージ(ESIMessage)を作成します。
    共通メッセージの作成方法については、“D.5 共通メッセージの作成・操作”を参照してください。

  6. ISIを呼出し、共通メッセージを送信、または受信します。

  7. 送信または受信結果によってコミットまたはロールバックを行います。

  8. トランザクションを終了し、ローカルDBから切断します。

注意

ESILocalTransactionクラスのclose()メソッドでは、ローカルDBとのコネクションのクローズは行いません。別途、Connectionクラスのclose()メソッドを実行してください。

アプリケーションの例(送信)

import java.sql.Connection;
import java.sql.DriverManager;
import com.fujitsu.esi.client.ESIAPIException;
import com.fujitsu.esi.client.ESILocalTransaction;
import com.fujitsu.esi.client.ESIService;
import com.fujitsu.esi.client.ESIServiceFactory;
import com.fujitsu.esi.message.ESIHeaderConstants;
import com.fujitsu.esi.message.ESIMessage;
 
public class ESISend {
    public static void main(String[] args) {
        
        ESILocalTransaction localTran = null;
        Connection con = null;
        try {
            // (2)ローカルDBとの接続
            // JDBCドライバをロードします。
            Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");
            // DBと接続します。
            con = DriverManager.getConnection(
                        "jdbc:symford://isiserv:2050/ESIMESSAGEDB","UID", "PWD");
            // 自動コミットのオフ
            con.setAutoCommit(false);

            // (3)通信制御クラス(ESIService)を生成
            ESIService service = ESIServiceFactory.getService("endpointJMSRIN");
            
            // (4)トランザクション制御クラスを生成
            localTran = service.createLocalTransaction(con);
            
            // (5)ESIMessageを作成
            ESIMessage message = new ESIMessage();
                           :
            // (6)ISIを呼び出す(共通メッセージの送信)
            ESIMessage returnMessage = service.send(message, localTran); ……(a)
                           :
            // (7)送信結果に合わせてトランザクションの制御を行う
            String status = returnMessage.getHeader().getParameter().
                                                get("com.fujitsu.esi.status");
            if ( status.equals("SUCCESS") ) {
                 // 送信が成功
                 // SQL文の発行を行う。
                           :
                 // SQL文の発行まで、正常に終了したのでコミット
                 localTran.commit();
            }else{
                 // エラーが発生したのでロールバック
                 localTran.rollback();
            }
                           :
        } catch (Exception e) {
            // (SQL発行を含む)エラーが発生したのでロールバック
            try {
               if (localTran != null) {
                  localTran.rollback();
               }
            }catch(ESIAPIException apie){
               apie.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            // (8)トランザクション終了およびDBとの切断
            try{
               if ( localTran != null ) {
                  localTran.close();
               }
               if ( con != null ) {
                  con.close();
               }
            } catch (Exception e) {
               e.printStackTrace();
            }
        }
    }
}

アプリケーションの例(受信)

import java.sql.Connection;
import java.sql.DriverManager;
import com.fujitsu.esi.client.ESIAPIException;
import com.fujitsu.esi.client.ESILocalTransaction;
import com.fujitsu.esi.client.ESIService;
import com.fujitsu.esi.client.ESIServiceFactory;
import com.fujitsu.esi.message.ESIHeaderConstants;
import com.fujitsu.esi.message.ESIMessage;
 
public class ESIReceive {
    public static void main(String[] args) {
        
        ESILocalTransaction localTran = null;
        Connection con = null;
        try {
            // (2) ローカルDBとの接続
            // JDBCドライバをロードします。
            Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver");
            // データベースと接続します。
            con = DriverManager.getConnection(
                        "jdbc:symford://isiserv:2050/ESIMESSAGEDB","UID", "PWD");
            // 自動コミットのオフ
            con.setAutoCommit(false);

            // (3)通信制御クラス(ESIService)を生成
            ESIService service = ESIServiceFactory.getService("endpointJMSROUT");

            // (4)トランザクション制御クラスを生成
            localTran = service.createLocalTransaction(con);
            
            // (6)ISIを呼び出す(共通メッセージの受信)            
            ESIMessage returnMessage = service.receive(localTran); ……(a)
                           :
            // (7)受信結果に沿ってトランザクションの制御を行う
            if ( returnMessage != null ) {
                 // 受信メッセージをもとにローカルDBに対してSQLを発行する。
                           :
             }
             // 処理が終了したのでコミットする。
             localTran.commit();

        } catch (Exception e) {
            // (SQL発行を含む)エラーが発生したのでロールバック
            try {
               if (localTran != null) {
                  localTran.rollback();
               }
            }catch(ESIAPIException apie){
               apie.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            // (8)トランザクション終了およびDBとの切断
            try{
               if ( localTran != null ) {
                  localTran.close();
               }
               if ( con != null ) {
                  con.close();
               }
            } catch (Exception e) {
               e.printStackTrace();
            }
        }
      }
}

ローカルDBとのトランザクション機能を利用するためのメッセージ送受信APIの送信API、受信APIとして提供しているメソッドは、以下のとおりです。

非同期送信呼出し:send(ESIMessage,ESILocalTransaction)

非同期受信呼出し(フィルタ付き):receive(ESIFilter,ESILocalTransaction)

非同期受信呼出し(フィルタなし):receive(ESILocalTransaction)