例をもとに、ローカルDBとのトランザクション機能を利用したアプリケーションの開発手順を説明します。
アプリケーションの開発は、以下の手順で行います。
図D.10 開発の手順
前提
サービスエンドポイント名:endpointJMSRIN、endpointJMSROUT
DBの種類:Symfoware Server
DBの接続先:jdbc:symford://isiserv:2050/ESIMESSAGEDB
DBのユーザID:UID
DBのパスワード:PWD
手順
サービスエンドポイント定義を作成します。
メッセージ送受信APIを利用するためのサービスエンドポイント定義にサービスエンドポイント名“endpointJMSRIN”と“endpointJMSROUT”を定義します。
作成方法については、“ISI Studio ヘルプ”を参照してください。
ローカルDBと接続します。
ローカルDBと接続し、自動コミットをオフにします。
接続先のDBは、環境に合わせて変更してください。
手順1で作成したサービスエンドポイント名をパラメタに設定し、通信制御クラス(ESIService)を生成します。
トランザクション制御クラス(ESILocalTransaction)を生成します。手順2で作成したローカルDBとの接続情報をパラメタに設定します
共通メッセージ(ESIMessage)を作成します。
共通メッセージの作成方法については、“D.5 共通メッセージの作成・操作”を参照してください。
ISIを呼出し、共通メッセージを送信、または受信します。
送信または受信結果によってコミットまたはロールバックを行います。
トランザクションを終了し、ローカル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)