この章では、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);
}
}
}
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ファイルのコールアウト・ディレクトリを指定する方法は、「構成パラメータの設定」を参照してください。 |
説明 |
説明を入力します。 |
タイムアウト(秒) |
コールアウトを処理する時間制限を入力します。 |
コールアウト・パラメータは、グローバル変数の概念に似ており、特定のコールアウト使用にのみ適用可能なローカル値を指定できます。また、作成したコールアウト・パラメータは、すべてのコールアウト使用に適用可能なデフォルト値として指定できます。既存のコールアウトのコールアウト・パラメータを変更すると、そのコールアウトを使用するすべてのアグリーメントに影響を与えます。
表13-2に、オプションのコールアウト・パラメータ属性を示します。
表13-2 コールアウト・パラメータの属性
フィールド | 説明 |
---|---|
名前 |
パラメータ名を入力します。 |
タイプ |
「整数」、「浮動小数」、「文字列」、「ブール」、「日付」の中から選択します。「日付」タイプの書式はMM/DD/YYYYです。 注意: タイプを変更すると、パラメータのデフォルト値が無効になることがあります。 |
値 |
値を入力します。「暗号化」が「True」に設定されている場合、この値は暗号化されます。 |
必須 |
「True」または「False」を選択します。 |
暗号化 |
「True」または「False」を選択します。 |
説明 |
説明を入力します(オプション)。 |
作成したコールアウトは、アグリーメントへのインクルードが可能になります。詳細は、「アグリーメントへのコールアウトのインクルード」を参照してください。アグリーメントへのデプロイ後にコールアウトを変更した場合は、サーバーを再起動する必要があります。
コールアウトを作成するには:
コールアウトの詳細、パラメータまたはパラメータ値はいつでも編集できますが、コールアウト名は編集できません。
この機能は、付属のPGPコールアウトjarを使用することで、トランスポート・コールアウトとしてB2BおよびHealthcareでのみ使用できます。ユーザーはPGP鍵を作成できる必要があります。
使用方法のシナリオ
インバウンド: Oracle B2B/Healthcareは、外部の取引パートナから暗号化されたPGPメッセージを受信します。メッセージ処理の一環として、暗号化されたPGPメッセージは、企業の秘密鍵を使用して復号化されます。PGPで暗号化されたメッセージにデジタル署名が含まれている場合は、送信者の公開鍵を使用してデジタル署名が検証されます。また、PGPで暗号化されたメッセージにメッセージ・ダイジェストが含まれている場合は、復号化の一環としてデータ整合性が検証されます。
アウトバウンド: Oracle B2B/Healthcareは、暗号化されたPGPメッセージを外部の取引パートナに送信します。処理の一環として、メッセージは外部の取引パートナの公開鍵を使用してPGP APIで暗号化されます。暗号化するときに、企業はメッセージの発信元認証のためのデジタル署名や、整合性チェックのためのメッセージ・ダイジェストを追加するオプションを選択できます。メッセージに署名する場合は、企業の秘密鍵を使用します。
コールアウト・パラメータ
PGPコールアウトでは、コールアウトの構成時に次のコールアウト・パラメータが必要になります。
publicKeyLocation
secretKeyLocation
password
direction
encryptionType
EncryptionTypeは、暗号化に使用するアルゴリズムの種類を指定するために使用します。次の表に、サポートされている種類の一覧と、コールアウトに指定する必要のある整数値を示します。たとえば、AES_256アルゴリズムを使用する場合は、encryptionTypeのコールアウト・パラメータ値を9にします。
EncryptionType | 整数値 |
---|---|
TRIPLE_DES |
2 |
CAST5 |
3 |
BLOWFISH |
4 |
DES |
6 |
AES_128 |
7 |
AES_192 |
8 |
AES_256 |
9 |
TWOFISH |
10 |
作成したコールアウトは、アグリーメントへのインクルードが可能になります
これは、図13-5に示されています。
コールアウトをアグリーメントにインクルードするには:
「パートナ」をクリックします。
アグリーメント名をクリックします。
コールアウトを選択します。
「保存」をクリックします。
特定のアグリーメントに対するコールアウト・パラメータの値を更新するには:
これらは、コールアウトを実装するためのコードの例です。
例13-2は、受信したXMLドキュメントを別のXMLドキュメントに変換する方法を示しています。ディレクトリ構造は、oracle.tip
.
callout
です。この例では、出力CalloutMessageを出力リストに設定する必要があります(output.add(cmOut)
)。
例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は、トランスポート同期コールバックと一緒に使用する同期コールバック・コールアウトを作成する方法を示しています。詳細は、トランスポート同期コールバックの使用を参照してください。
例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); } } }