例を元にアダプタ出口アプリケーションの作成方法を説明します。
注意
System.exit()は行わないでください。
出口アプリケーションでは、スレッド生成やスレッド制御処理を行わないでください。
コンストラクタを定義する場合は、publicな引数なしのコンストラクタを定義してください。
前出口、後出口、エラー出口を利用する場合の、出口アプリケーションの実装例を以下に示します。
package com.example.myesb; import com.fujitsu.esi.process.api.ESIErrorHandler; import com.fujitsu.esi.process.api.ESIPostProcess; import com.fujitsu.esi.process.api.ESIPreProcess; import com.fujitsu.esi.process.api.ESIProcessDataBean; import com.fujitsu.esi.process.api.ESIProcessException; import com.fujitsu.esi.process.api.ESISOAPInfo; import com.fujitsu.esi.message.ESIHeaderConstants; public class UserProcess implements ESIPreProcess, ESIPostProcess, ESIErrorHandler { public void callPreProcess(ESIProcessDataBean msg) throws ESIProcessException { // 前出口処理を記述 } public void callPostProcess(ESIProcessDataBean msg) throws ESIProcessException { // 後出口処理を記述 } public void handleException(ESIProcessException error, ESIProcessDataBean msg) throws ESIProcessException { // エラー出口処理を記述 } }
エラー出口処理では、パラメーターで渡されたエラー情報から、エラーの原因情報を取得して参照することができます。エラーの原因情報を取得する方法を以下に示します。
public class UserProcess implements ESIPreProcess, ESIPostProcess, ESIErrorHandler { public void handleException(ESIProcessException error, ESIProcessDataBean msg) throws ESIProcessException { // パラメーターのエラー情報からエラーの原因情報を取得 Throwable cause = error.getCause(); } }
エラー出口で任意のSOAP Faultを設定する場合の、エラー出口メソッドの実装例を以下に示します。
public void handleException(ESIProcessException error, ESIProcessDataBean msg) throws ESIProcessException { // SOAP1.2のSOAP Faultを作成する StringBuffer sb = new StringBuffer(); sb.append( "<?xml version=\"1.0\" ?>" + "<env:Envelope xmlns:env=\"http://www.w3.org/2003/05/soap-envelope\">" + "<env:Body>" + "<env:Fault>" + "<env:Code>" + "<env:Value>" ); sb.append("env:Receiver"); sb.append( "</env:Value>" + "</env:Code>" + "<env:Reason>" + "<env:Text xml:lang=\"ja\">" ); sb.append("Error Message" ); sb.append( "</env:Text>"+ "</env:Reason>" + "</env:Fault>" + "</env:Body>" + "</env:Envelope>" ); byte[] payload = null; try { payload = sb.toString().getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { // 例外処理 } msg.setPayload(payload); }
以下に設定例を示します。
public class UserProcess implements ESIPreProcess, ESIPostProcess, ESIErrorHandler { public void handleException(ESIProcessException error, ESIProcessDataBean msg) throws ESIProcessException { // 共通メッセージのヘッダを取得 Map<String, String> header = msg.getHeader(); // サービス呼出しのリトライを行わないように"true"を設定 header.put("com.fujitsu.esi.function.servicecall.retry.ignore", "true"); } }
以下に後出口の例を示します。前出口とエラー出口の例もここで示す例とほぼ同様の内容となります。
public class UserProcess implements ESIPreProcess, ESIPostProcess, ESIErrorHandler { // 後出口処理 public void callPostProcess(ESIProcessDataBean msg) throws ESIProcessException { try { byte[] b = msg.getPayload(); String soapmsg = new String( b, "UTF-8" ); ESISOAPInfo si = (ESISOAPInfo) msg.getAdapterInfo(); MimeMultipart mmp = si.getMimeMultipart(); int partCount = mmp.getCount(); for( int i = 0; i < partCount; i++ ) { BodyPart bp = mmp.getBodyPart( i); ContentType ct = new ContentType( bp.getContentType() ); String basetype = ct.getBaseType().toLowerCase(); if( basetype.equals ("application/xop+xml")) { // ルートパート(SOAPメッセージ)の参照 Object obj = bp.getContent(); …省略… } else { // 添付ファイル参照 Object obj = bp.getContent(); …省略… } } } catch (UnsupportedEncodingException uee) { // 例外処理 } catch (MessagingException me) { // 例外処理 } catch (IOException e) { // 例外処理 } } }
作成したアプリケーションをコンパイルする場合、クラスパスに以下のパスを追加してください。
<INSDIR>\lib\esicore.jar
/opt/FJSVesi/lib/esicore.jar
作成したアプリケーションをjarファイルにまとめます。
実行例
jar cf application.jar .