この章では、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);
}
}
}