この章では、Javaコールアウトの作成および使用方法について説明します。Javaコールアウトは、ホスト取引パートナとリモート取引パートナ間で交換されるメッセージのフォーマットを変換します。通常、コールアウトを使用することで、XSLTスタイル・シートおよびJavaプログラムを起動できます。
項目は次のとおりです。
コールアウトは、ホスト取引パートナ・アプリケーションで使用されるメッセージ・フォーマットと、リモート取引パートナで使用されるメッセージ・フォーマットが異なっている環境で使用されます。たとえば、図12-1に示すように、リモート取引パートナがRosettaNet XMLフォーマットの発注リクエストをホスト取引パートナに送信するとします。
この例では、ホスト取引パートナのホスト・アプリケーションはOracle E-Business Suiteアプリケーションです。このアプリケーションでは、RosettaNet XMLフォーマットのメッセージは使用されません。これら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つ以上のコールアウト・パラメータの値を変更することによって、同じコールアウトを複数のアグリーメントに追加できます。 パラメータの追加方法は図12-3、パラメータ属性のリストは表12-2を参照してください。
別のタイプのコールアウトはトランスポート・コールアウトです。このコールアウトはチャネルに関連付けられます。 インバウンド・メッセージの場合、B2Bはトランスポートからメッセージを受信した直後にトランスポート・コールアウトを起動します。 アウトバウンド・メッセージの場合は、トランスポートにメッセージを送信する直前にトランスポート・コールアウトを起動します。 図12-2に示すように、トランスポート・コールアウトはチャネル構成で選択でき、任意のプロトコルとともに使用できます。
トランスポート・コールアウトを使用すると、MLLPプロトコルを使用しているインバウンドおよびアウトバウンド・メッセージのカスタム・ヘッダーを抽出できます。 例12-1に、コールアウトにCUSTOM_HEADER
プロパティを設定および取得する方法を示します。
例12-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.1.4項「トランスポート・コールアウトを使用したカスタム・ヘッダーの抽出」を参照してください。
第12.2項「コールアウトの作成」で説明するように、トランスポート・コールアウトは他のコールアウトと同様に「コールアウト」タブで作成します。 トランスポート・コールアウトはアグリーメントに追加されませんが、「アグリーメント」タブの「コールアウト」リストには、すべてのトランスポート・コールアウトが表示されるため、選択可能の状態です。 トランスポート・コールアウトを作成するときに、そのタイプを示す名前を設定することによって、「アグリーメント」タブの「コールアウト」リストから誤って選択するのを避けることができます。
Oracle B2Bが提供するコールアウトJARファイルではユーザーのニーズを満たすことができない場合は、Oracle Fusion Middleware B2BコールアウトJava APIリファレンスで説明されている標準に従って、Oracle B2B外で独自のコールアウトJARファイルを作成できます。 「管理」リンクの「構成」タブを使用して、この外部JARファイルのディレクトリの場所を指定します。 コールアウト用に外部JARファイルを作成することをお薦めします。コールアウトをb2b.jarにバンドルしないでください。
注意: MySampleCalloutは制限付きキーワードであるため、使用できません。 これはすでにb2b.jarにパッケージされています。 |
コールアウトを作成するには、図12-3に示されているように、コールアウトの詳細(実装クラス名およびライブラリ名)とコールアウト・パラメータを指定します。
それぞれを異なる実装名に割り当てる場合は、同じ名前のコールアウトを複数作成できます。アグリーメントに含まれているコールアウトを削除することはできません。
表12-1に、指定する必要のあるコールアウトの詳細を示します。
表12-1 コールアウトの詳細
フィールド | 説明 |
---|---|
クラス・ファイルを 注意: Oracle B2Bには、XML-to-XMLトランスフォーメーションのために使用できる、XSLTCalloutImplという名前の事前定義済クラス・ファイルが用意されています。 |
|
コールアウト実装クラスがあるJARファイル名を入力します。 注意: 独自のコールアウトJARファイルを1つ以上指定する場合は、ディレクトリの場所を指定する必要があります。 「管理」リンクの「構成」タブを使用します。 Oracle B2Bに含まれているデフォルトの 環境間でコールアウト・ライブラリを移行するには、手動で行う必要があります。 B2Bのインポート/エクスポート機能では、コールアウト・ライブラリJARを移行できません。 独自のコールアウトJARファイル用のコールアウト・ディレクトリの指定については、第15.1項「構成パラメータの設定」を参照してください。 図bb_calloutdir1.gifの説明 |
|
説明 |
説明を入力します。 |
タイムアウト(秒) |
コールアウト処理の制限時間を入力します。 |
概念的には、コールアウト・パラメータは、特定のコールアウトの使用にのみ適用されるローカル値を割り当てることができる点で、グローバル変数に似ています。また、コールアウト・パラメータを作成して、コールアウトのすべての使用に適用できるデフォルト値に割り当てることもできます。 既存のコールアウトのコールアウト・パラメータを変更すると、そのコールアウトを使用するすべてのアグリーメントが影響を受けます。
表12-2に、オプションのコールアウト・パラメータ属性を示します。
表12-2 コールアウト・パラメータ属性
フィールド | 説明 |
---|---|
名前 |
パラメータ名を入力します。 |
タイプ |
整数、浮動小数点、文字列、ブールまたは日付タイプから選択します。 日付タイプの書式はMM/DD/YYYYです。 注意: タイプを変更すると、パラメータのデフォルト値が無効になる可能性があります。 |
値 |
値を入力します。 「暗号化」を「TRUE」に設定した場合、この値は暗号化されます。 |
必須 |
「TRUE」または「FALSE」を選択します。 |
暗号化 |
「TRUE」または「FALSE」を選択します。 |
説明 |
任意の説明を入力します。 |
コールアウトの作成が完了した後は、そのコールアウトをアグリーメントに追加できます。 詳細は、第12.3項「コールアウトのアグリーメントへの追加」を参照してください。 コールアウトをアグリーメントにデプロイした後にそのコールアウトを変更した場合は、サーバーを再起動する必要があります。
コールアウトを作成する手順は、次のとおりです。
「管理」をクリックし、「コールアウト」をクリックします。
「コールアウト」セクションで、「追加」をクリックします。
コールアウトの名前を入力します。
(トランスポート・コールアウトを作成している場合は、そのトランスポート・コールアウトを名前で示すことができます。)
表12-1の説明に従って、コールアウトの詳細を入力します。
(オプション)「パラメータ」セクションで、「追加」をクリックします。
表12-2の説明に従って、パラメータ名と属性を入力します。
「保存」をクリックします。
詳細、パラメータまたはパラメータ値はいつでも編集できますが、コールアウト名を編集することはできません。
図12-4に示されているように、コールアウトの作成が完了した後は、そのコールアウトをアグリーメントに追加できます。
コールアウトをアグリーメントに追加する手順は、次のとおりです。
「パートナ」をクリックします。
アグリーメント名を入力します。
コールアウトを選択します。
「保存」をクリックします。
特定のアグリーメントのコールアウト・パラメータ値を更新する手順は、次のとおりです。
「パートナ」をクリックします。
アグリーメント名を入力します。
コールアウトを選択します。
「コールアウトの詳細」をクリックします。
パラメータ名の値を入力します(図12-5を参照)。
「OK」をクリックします。
例12-2に、受信XMLドキュメントを別のXMLドキュメントに変換する方法を示します。 ディレクトリ構造はoracle.tip
.
callout
です。 この例では、出力CalloutMessageを出力リストに設定する必要があります(output.add(cmOut)
)。
例12-3に、トランスポート同期コールバックで使用する同期コールバック・コールアウトの作成方法を示します。 詳細は、第5.5.2項「トランスポート同期コールバックの使用」を参照してください。
例12-2 XML-to-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); } } }
例12-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"); */ properties.put("FROM_PARTY", "Acme"); properties.put(B2BParameters.TO_PARTY, "GlobalChips"); properties.put(B2BParameters.DOCTYPE_NAME, "CustomDocumentType"); properties.put(B2BParameters.DOCTYPE_REVISION, "1.0"); message.setParameters(properties); FileInputStream inStream = new FileInputStream("/tmp/GlobalChips_12345.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); } } }