この章では、Javaコールアウトの作成方法と使用方法について説明します。Javaコールアウトは、ホストとリモートの取引パートナ間で交換されるメッセージの書式を変換します。コールアウトを使用すると、通常、XSLTスタイル・シートおよび任意のJavaプログラムを起動できます。
この章には次のトピックが含まれます:
コールアウトは、リモート取引パートナとは異なるメッセージ書式をホスト取引パートナ・アプリケーションで使用している環境で使用されます。たとえば、図13-1に示すように、リモートの取引パートナが、RosettaNet XML形式の発注リクエストをホスト取引パートナに送信するとします。
この例では、ホスト取引パートナのホスト・アプリケーションは、RosettaNet XML書式のメッセージを使用していないOracle E-Business Suiteアプリケーションです。2つの異なる書式間での通信を可能にするには、次のように2つのコールアウトを作成します。
1つ目のコールアウトcallout_inbound
。たとえば、RosettaNet XML書式の発注リクエストを、Oracle E-Business Suiteアプリケーションで解釈可能なOracle E-Business Suite XML書式に変換します。これにより、Oracle E-Business Suiteアプリケーションは、Oracle E-Business Suite XML書式の発注受入れメッセージを使用して、リクエスト・メッセージに応答します。
2つ目のコールアウトcallout_outbound
。たとえば、Oracle E-Business Suite XML書式を、リモート取引パートナ用のRosettaNet XML書式のメッセージに戻します。
作成した2つのコールアウトを、次のように、このメッセージ交換に関して作成された2つのアグリーメントに関連付けます。
callout_outbound
をアウトバウンド・メッセージに関するアグリーメント(つまり、開始側の発注リクエストに関するアグリーメント)にインクルードします。
callout_inbound
をインバウンド・メッセージに関するアグリーメント(つまり、応答側の発注受け入れに関するアグリーメント)にインクルードします。
ドキュメント定義はアグリーメントのコンポーネントであるため、コールアウトは特定のドキュメント定義に関連付けられます。
この発注の例は、1つのコールアウトから1つのアグリーメントへの単純なアソシエーションを示しています。しかし、実際には、1つ以上のコールアウト・パラメータの値を変更することによって、同じコールアウトを多数の異なるアグリーメントにインクルードできます。パラメータを追加する場所については、図13-3を参照してください。パラメータ属性のリストは、表13-2を参照してください。
もう1つのタイプのコールアウトはトランスポート・コールアウトで、チャネルと関連付けられます。インバウンド・メッセージの場合、B2Bは、トランスポートからメッセージを受信した直後にトランスポート・コールアウトを呼び出します。アウトバウンド・メッセージの場合、B2Bは、トランスポートにメッセージを送信する直前にトランスポート・コールアウトを呼び出します。トランスポート・コールアウトは、図13-2で示されているようにチャネル構成で選択でき、任意のプロトコルで使用できます。
トランスポート・コールアウトを使用すると、MLLPプロトコルを使用するインバウンドおよびアウトバウンド・メッセージのカスタム・ヘッダーを抽出できます。例13-1では、コールアウトでCUSTOM_HEADER
プロパティを設定および取得する方法を示します。
例13-1 CUSTOM_HEADERプロパティの設定と取得
import java.util.*;
import oracle.tip.b2b.callout.*;
import oracle.tip.b2b.callout.exception.*;
public class SampleCallout implements Callout {
public void execute(CalloutContext context,List input,List output)
throws CalloutDomainException, CalloutSystemException {
try {
CalloutMessage cmIn = (CalloutMessage)input.get(0);
String s =cmIn.getBodyAsString();
//for getting the CUSTOM_HEADER
Properties params = (Properties)cmIn.getParameters();
String customHeader = (String)params.get("CUSTOM_HEADER");
//for setting the CUSTOM_HEADER
CalloutMessage cmOut = new CalloutMessage(s);
cmOut.setParameter("CUSTOM_HEADER", "your_value");
output.add(cmOut);
} catch (Exception e) {
throw new CalloutDomainException(e);
}
}
}
詳細は、第5.5.2.4項 カスタム・ヘッダーを抽出するためのトランスポート・コールアウトの使用を参照してください。
第13.2項「コールアウトの作成」の説明のとおり、トランスポート・コールアウトは他のコールアウトと同じように、「コールアウト」タブから作成します。トランスポート・コールアウトはアグリーメントには追加されませんが、「アグリーメント」タブの「コールアウト」リストにはすべてのトランスポート・コールアウトが表示されるため、ここで選択できます。混乱を回避するには、トランスポート・コールアウトの作成時に「アグリーメント」タブの「コールアウト」リストで選択しないように、タイプがわかる名前にしてください。
Oracle B2Bに用意されているコールアウトJARファイルがユーザーのニーズを十分に満たさない場合は、Oracle Fusion Middleware B2B Callout Java APIリファレンスに記載されている標準に従って、Oracle B2Bの外部で独自のコールアウトJARファイルを作成できます。この外部JARファイルのディレクトリの場所を指定するには、「管理」リンクの「構成」タブを使用します。独自のコールアウト用には、外部JARファイルを作成することをお薦めします。独自のコールアウトはb2b.jarにバンドルしないでください。
注意: MySampleCalloutは制限されたキーワードであるため使用しないでください。それはすでにb2b.jarにパッケージされています。 |
コールアウトを作成するには、図13-3に示すように、コールアウトの詳細(実装クラス名とライブラリ名)およびコールアウト・パラメータを指定します。
コールアウトに異なる実装名を指定する場合は、複数のコールアウトを同じ名前で作成できます。アグリーメントにインクルードされているコールアウトは削除できません。
表13-1に、指定するコールアウトの詳細を示します。
表13-1 コールアウトの詳細
フィールド | 説明 |
---|---|
クラス・ファイル名は 注意: Oracle B2Bには、XML間のトランスフォーメーションに使用できるXSLTCalloutImplという事前定義のクラス・ファイルがあります。 |
|
コールアウト実装クラスを保持するJARファイル名を入力します。 注意: 独自のコールアウトJARファイルを1つ以上指定する場合は、ディレクトリの場所を指定する必要があります。「管理」リンクから「構成」タブを使用します。Oracle B2Bに組み込まれているデフォルト コールアウト・ライブラリを環境間で移行するには、手動で行う必要があります。B2Bのエクスポート/インポート機能は、コールアウト・ライブラリのJARを移行しません。 独自のコールアウトJARファイルのコールアウト・ディレクトリを指定する方法は、第17.1項 構成パラメータの設定を参照してください。 bb_calloutdir1.gifの説明 |
|
説明 |
説明を入力します。 |
タイムアウト(秒) |
コールアウトを処理する時間制限を入力します。 |
コールアウト・パラメータは、グローバル変数の概念に似ており、特定のコールアウト使用にのみ適用可能なローカル値を指定できます。また、作成したコールアウト・パラメータは、すべてのコールアウト使用に適用可能なデフォルト値として指定できます。既存のコールアウトのコールアウト・パラメータを変更すると、そのコールアウトを使用するすべてのアグリーメントに影響を与えます。
表13-2に、オプションのコールアウト・パラメータ属性を示します。
表13-2 コールアウト・パラメータの属性
フィールド | 説明 |
---|---|
名前 |
パラメータ名を入力します。 |
タイプ |
「整数」、「浮動小数」、「文字列」、「ブール」、「日付」の中から選択します。「日付」タイプの書式はMM/DD/YYYYです。 注意: タイプを変更すると、パラメータのデフォルト値が無効になることがあります。 |
値 |
値を入力します。「暗号化」が「True」に設定されている場合、この値は暗号化されます。 |
必須 |
「True」または「False」を選択します。 |
暗号化 |
「True」または「False」を選択します。 |
説明 |
説明を入力します(オプション)。 |
作成したコールアウトは、アグリーメントへのインクルードが可能になります。詳細は、第13.3項 アグリーメントへのコールアウトのインクルードを参照してください。アグリーメントへのデプロイ後にコールアウトを変更した場合は、サーバーを再起動する必要があります。
コールアウトを作成するには:
「管理」、「コールアウト」の順にクリックします。
「コールアウト」セクションで、「追加」をクリックします。
コールアウトの名前を入力します。
(トランスポート・コールアウトを作成しているかどうかは、名前で示すことができます。)
表13-1の説明に従って、コールアウトの詳細を入力します。
(オプション)「パラメータ」セクションで、「追加」をクリックします。
表13-2の説明に従って、パラメータ名と属性を入力します。
「保存」をクリックします。
コールアウトの詳細、パラメータまたはパラメータ値はいつでも編集できますが、コールアウト名は編集できません。
作成したコールアウトは、図13-4に示すように、アグリーメントへのインクルードが可能になります。
コールアウトをアグリーメントにインクルードするには:
「パートナ」をクリックします。
アグリーメント名をクリックします。
コールアウトを選択します。
「保存」をクリックします。
特定のアグリーメントに対するコールアウト・パラメータの値を更新するには:
「パートナ」をクリックします。
アグリーメント名をクリックします。
コールアウトを選択します。
「コールアウトの詳細」をクリックします。
図13-5に示すように、パラメータ名に対する値を入力します。
「OK」をクリックします。
例13-2は、受信したXMLドキュメントを別のXMLドキュメントに変換する方法を示しています。ディレクトリ構造は、oracle.tip
.
callout
です。この例では、出力CalloutMessageを出力リストに設定する必要があります(output.add(cmOut)
)。
例13-3は、トランスポート同期コールバックと一緒に使用する同期コールバック・コールアウトを作成する方法を示しています。詳細は、第5.5.5項 トランスポート同期コールバックの使用を参照してください。
例13-2 XML間のトランスフォーメーションのコード例
import java.io.*; import java.net.*; import java.util.*; import oracle.xml.parser.v2.*; import oracle.tip.b2b.callout.Callout; import oracle.tip.b2b.callout.CalloutMessage; import oracle.tip.b2b.callout.CalloutContext; import oracle.tip.b2b.callout.exception.*; /** * This sample callout transforms the incoming XML document * to another XML document. It also shows how to generate * Functional Ack and Error message. */ public class XSLTCalloutImpl implements Callout { public void execute(CalloutContext context, List input, List output) throws CalloutDomainException, CalloutSystemException { try { // (1) Retrieve the callout properties from CalloutContext String xsltFile = context.getStringProperty("xsltFile"); // (2) Get the input callout message CalloutMessage cmIn = (CalloutMessage)input.get(0); // (3) Process the message // instantiate a stylesheet URL xslURL = new URL("file://" + xsltFile); XSLProcessor processor = new XSLProcessor(); XSLStylesheet xsl = processor.newXSLStylesheet(xslURL); // parser input XML content DOMParser parser = new DOMParser(); parser.setPreserveWhitespace(true); parser.parse(new StringReader(cmIn.getBodyAsString())); XMLDocument xml = parser.getDocument(); processor.showWarnings(true); processor.setErrorStream(System.err); // Transform the document StringWriter strWriter = new StringWriter(); processor.processXSL(xsl, xml, new PrintWriter(strWriter)); // (4) Create a output callout message // create a callout output message CalloutMessage cmOut = new CalloutMessage(strWriter.getBuffer().toString()); strWriter.close(); // create Functional Ack callout message // this is an optional step CalloutMessage fa = new CalloutMessage(/*set FA payload here*/); fa.setParameter("functional_ack", "true"); //setting your own doctype and revision //set the doc type name and revision as defined in b2b ui fa.setParameter("doctype_name", "fa"); fa.setParameter("doctype_revision", "1.0"); // create Error callout message // this is an optional step CalloutMessage err = new CalloutMessage(/* set the payload that causes this error */); err.setParameter("error_message", "true"); err.setParameter("error_desc", "set the error desc"); output.add(cmOut); output.add(fa); output.add(err); //(5) Throw an exception, if any } catch (Exception e) { throw new CalloutDomainException(e); } } }
例13-3 同期コールバック・コールアウトのコード例
import java.io.FileInputStream; import java.util.List; import java.util.Properties; import oracle.tip.b2b.callout.Callout; import oracle.tip.b2b.callout.CalloutContext; import oracle.tip.b2b.callout.CalloutMessage; import oracle.tip.b2b.callout.exception.CalloutDomainException; import oracle.tip.b2b.callout.exception.CalloutSystemException; import oracle.tip.b2b.domain.B2BParameters; import oracle.tip.b2b.system.B2BRuntimeException; import oracle.tip.b2b.system.ErrorKeys; public class SyncSampleCallout implements Callout { public void execute(CalloutContext calloutContext, List input, List output) throws CalloutDomainException, CalloutSystemException { try { CalloutMessage message = new CalloutMessage(); Properties properties = new Properties(); properties.put("FROM_PARTY", "MarketInc"); properties.put(B2BParameters.TO_PARTY, "OracleServices"); properties.put(B2BParameters.DOCTYPE_NAME, "271"); properties.put(B2BParameters.DOCTYPE_REVISION, "4010X092A1"); message.setParameters(properties); FileInputStream inStream = new FileInputStream("/tmp/271.dat"); byte[] content = new byte[inStream.available()]; inStream.read(content); inStream.close(); message.setBody(content); output.add(message); } catch(Exception e) { new B2BRuntimeException(ErrorKeys.B2B_RUNTIME_ERROR, e); } } }