4.10.4 onMessageメソッドでの業務ロジックの実装
onMessageメソッドに,次に示す業務ロジックを実装します。
public TP1OutMessage onMessage(TP1InMessage in) { //入力パラメタ取得 byte[] inputdata = in.getInputData(); ・・・ //出力データオブジェクトの生成 TP1OutMessage out = in.createOutMessage(); ・・・ ・・・ //出力データ格納領域の長さを取得 int outLen = out.getMaxOutputLength(); ・・・ try { ・・・ //出力データ格納領域の取得 byte[] outputdata = out.getOutputData(outLen); ・・・ //業務処理 //outputdata中に出力データを格納 ・・・ } catch(Exception e) { //errorLenにエラー処理用の出力データ長を設定 //エラー処理用の出力データ格納領域の取得 byte[] outputdata = out.getOutputData(errorLen); ・・・ //outputdata中にエラー情報を格納 ・・・ } return out; }
-
TP1InMessageからユーザデータを取得して業務処理を実行します。
-
実行結果の出力データをTP1OutMessageのgetOutputDataメソッドで取得したbyte配列中に格納して返します。
-
getOutputDataメソッドの引数outLenには,応答の長さを指定します。応答の長さは,0〜(TP1OutMessageインタフェースのgetMaxOutputLengthメソッドの戻り値)以下の範囲で指定してください。
-
onMessageメソッドの戻り値がnullの場合,またはgetOutputDataメソッドを呼び出していない場合は,出力データが未設定(null)のため,TP1インバウンドアダプタはエラーメッセージを出力して,RPCエラー(DCRPCER_SYSERR_AT_SERVER(-316))を返します。この場合,呼び出し元のdc_rpc_call関数はRPCエラー(トランザクショナルRPCでない場合はDCRPCER_SYSERR_AT_SERVER(-316),トランザクショナルRPCの場合はDCRPCER_SYSERR_AT_SERVER_RB(-325))を返します。
-
業務処理では例外をすべてキャッチして,エラー時もエラー情報をTP1OutMessageインタフェースのgetOutputDataメソッドで取得したbyte配列にエラー情報を格納して返してください。業務処理で発生した例外をキャッチしなかった場合,またはnullを返した場合は,エラーメッセージ(KDJE58459-E)が出力されて,RPCエラー(DCRPCER_SYSERR_AT_SERVER(-316))になります。この場合,呼び出し元のdc_rpc_call関数はRPCエラー(トランザクショナルRPCでない場合はDCRPCER_SYSERR_AT_SERVER(-316),トランザクショナルRPCの場合はDCRPCER_SYSERR_AT_SERVER_RB(-325))を返します。RPCエラー応答の詳細については,「4.17 TP1インバウンドアダプタで発生するRPCエラー応答」を参照してください。
Message-driven Bean(サービス)のコーディング例は,トランザクション連携機能を使用しない場合と,トランザクション連携機能を使用する場合の2種類があります。Message-driven Bean(サービス)のコーディング例を次に示します。
-
トランザクション連携機能を使用しない場合のコーディング例
import java.sql.Connection; import java.sql.PreparedStatement; import javax.ejb.EJBException; import javax.ejb.MessageDrivenBean; import javax.ejb.MessageDrivenContext; import javax.naming.InitialContext; import javax.sql.DataSource; import javax.transaction.UserTransaction; import com.hitachi.software.ejb.adapter.tp1.TP1InMessage; import com.hitachi.software.ejb.adapter.tp1.TP1MessageListener; import com.hitachi.software.ejb.adapter.tp1.TP1OutMessage; public class SampleMDB implements TP1MessageListener, MessageDrivenBean { private MessageDrivenContext context; public TP1OutMessage onMessage(TP1InMessage in) { //入力パラメタ取得 byte[] inputdata = in.getInputData(); //出力データオブジェクトの生成 TP1OutMessage out = in.createOutMessage(); //出力データ格納領域の長さを取得 int outLen = out.getMaxOutputLength(); UserTransaction ut = null; Connection con = null; PreparedStatement prepStmt = null; try { //DB更新する業務処理を実装 InitialContext ic = new InitialContext(); DataSource ds = (DataSource)ic.lookup( "java:comp/env/jdbc/SampleDB"); ut = context.getUserTransaction(); ut.begin(); con = ds.getConnection(); prepStmt = con.prepareStatement( "update sample set name = ? where id = 1"); prepStmt.setString(1, new String(inputdata)); prepStmt.executeUpdate(); ut.commit(); byte[] result ="update complete.".getBytes(); //出力データ格納領域の取得 byte[] outputdata = out.getOutputData(outLen); //業務処理の結果を出力データにコピー System.arraycopy(result,0,outputdata,0,result.length); } catch(Exception e) { //エラー処理 try { if(ut != null) { ut.rollback(); } } catch(Exception ex) { } byte[] wk = "An error occurred.".getBytes(); //エラー処理用の出力データ格納領域の取得 byte[] outputdata = out.getOutputData(wk.length); //エラー処理の内容を出力データにコピー System.arraycopy(wk,0,outputdata,0,wk.length); } finally { if(prepStmt != null) { try { prepStmt.close(); } catch(Exception exp) { } } if(con != null) { try { con.close(); } catch(Exception exp) { } } } return out; } public void ejbCreate() { } public void ejbRemove() throws EJBException { } public void setMessageDrivenContext(MessageDrivenContext ctx) throws EJBException { this.context = ctx; } }
-
トランザクション連携機能を使用する場合のコーディング例
import java.sql.Connection; import java.sql.PreparedStatement; import javax.ejb.EJBException; import javax.ejb.MessageDrivenBean; import javax.ejb.MessageDrivenContext; import javax.naming.InitialContext; import javax.sql.DataSource; import com.hitachi.software.ejb.adapter.tp1.TP1InMessage; import com.hitachi.software.ejb.adapter.tp1.TP1MessageListener; import com.hitachi.software.ejb.adapter.tp1.TP1OutMessage; public class SampleMDB implements TP1MessageListener, MessageDrivenBean { public TP1OutMessage onMessage(TP1InMessage in) { //入力パラメタ取得 byte[] inputdata = in.getInputData(); //出力データオブジェクトの生成 TP1OutMessage out = in.createOutMessage(); //出力データ格納領域の長さを取得 int outLen = out.getMaxOutputLength(); Connection con = null; PreparedStatement prepStmt = null; try { //DB更新する業務処理を実装 InitialContext ic = new InitialContext(); DataSource ds = (DataSource)ic.lookup( "java:comp/env/jdbc/SampleDB"); con = ds.getConnection(); prepStmt = con.prepareStatement( "update sample set name = ? where id = 1"); prepStmt.setString(1, new String(inputdata)); prepStmt.executeUpdate(); byte[] result ="update complete.".getBytes(); //出力データ格納領域の取得 byte[] outputdata = out.getOutputData(outLen); //業務処理の結果を出力データにコピー System.arraycopy(result,0,outputdata,0,result.length); } catch(Exception e) { //エラー処理 byte[] wk = "An error occurred.".getBytes(); //エラー処理用の出力データ格納領域の取得 byte[] outputdata = out.getOutputData(wk.length); //エラー処理の内容を出力データにコピー System.arraycopy(wk,0,outputdata,0,wk.length); } finally { if(prepStmt != null) { try { prepStmt.close(); } catch(Exception exp) { } } if(con != null) { try { con.close(); } catch(Exception exp) { } } } return out; } public void ejbCreate() { } public void ejbRemove() throws EJBException { } public void setMessageDrivenContext(MessageDrivenContext ctx) throws EJBException { } }