ヘッダーをスキップ
Oracle Fusion Middleware Oracle B2Bユーザーズ・ガイド
11g リリース1(11.1.1)
B61381-01
  ドキュメント・ライブラリヘ
ライブラリ
製品リストへ
製品
目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

12 コールアウトの管理

この章では、Javaコールアウトの作成および使用方法について説明します。Javaコールアウトは、ホスト取引パートナとリモート取引パートナ間で交換されるメッセージのフォーマットを変換します。通常、コールアウトを使用することで、XSLTスタイル・シートおよびJavaプログラムを起動できます。

項目は次のとおりです。

12.1 コールアウトの概要

コールアウトは、ホスト取引パートナ・アプリケーションで使用されるメッセージ・フォーマットと、リモート取引パートナで使用されるメッセージ・フォーマットが異なっている環境で使用されます。たとえば、図12-1に示すように、リモート取引パートナがRosettaNet XMLフォーマットの発注リクエストをホスト取引パートナに送信するとします。

図12-1 発注の例: 異なるフォーマットのXMLメッセージに対するコールアウトの使用

コールアウト
「図12-1 発注の例: 異なるフォーマットのXMLメッセージに対するコールアウトの使用」の説明

この例では、ホスト取引パートナのホスト・アプリケーションはOracle E-Business Suiteアプリケーションです。このアプリケーションでは、RosettaNet XMLフォーマットのメッセージは使用されません。これら2つの異なるフォーマット間での通信を可能にするには、次のように2つのコールアウトを作成します。

これら2つのコールアウトは、この例で作成された2つのアグリーメントに次のように関連付けられます。

ドキュメント定義はアグリーメントのコンポーネントであるため、コールアウトは特定のドキュメント定義に関連付けられます。

この発注の例は、コールアウトとアグリーメントの1対1の単純な関連を示しています。実際には、1つ以上のコールアウト・パラメータの値を変更することによって、同じコールアウトを複数のアグリーメントに追加できます。 パラメータの追加方法は図12-3、パラメータ属性のリストは表12-2を参照してください。

12.1.1 トランスポート・コールアウト

別のタイプのコールアウトはトランスポート・コールアウトです。このコールアウトはチャネルに関連付けられます。 インバウンド・メッセージの場合、B2Bはトランスポートからメッセージを受信した直後にトランスポート・コールアウトを起動します。 アウトバウンド・メッセージの場合は、トランスポートにメッセージを送信する直前にトランスポート・コールアウトを起動します。 図12-2に示すように、トランスポート・コールアウトはチャネル構成で選択でき、任意のプロトコルとともに使用できます。

図12-2 トランスポート・コールアウト

図12-2の説明は次にあります。
「図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項「コールアウトの作成」で説明するように、トランスポート・コールアウトは他のコールアウトと同様に「コールアウト」タブで作成します。 トランスポート・コールアウトはアグリーメントに追加されませんが、「アグリーメント」タブの「コールアウト」リストには、すべてのトランスポート・コールアウトが表示されるため、選択可能の状態です。 トランスポート・コールアウトを作成するときに、そのタイプを示す名前を設定することによって、「アグリーメント」タブの「コールアウト」リストから誤って選択するのを避けることができます。

12.1.2 コールアウト・ライブラリJARファイルの作成

Oracle B2Bが提供するコールアウトJARファイルではユーザーのニーズを満たすことができない場合は、Oracle Fusion Middleware B2BコールアウトJava APIリファレンスで説明されている標準に従って、Oracle B2B外で独自のコールアウトJARファイルを作成できます。 「管理」リンクの「構成」タブを使用して、この外部JARファイルのディレクトリの場所を指定します。 コールアウト用に外部JARファイルを作成することをお薦めします。コールアウトをb2b.jarにバンドルしないでください。


注意:

MySampleCalloutは制限付きキーワードであるため、使用できません。 これはすでにb2b.jarにパッケージされています。

12.2 コールアウトの作成

コールアウトを作成するには、図12-3に示されているように、コールアウトの詳細(実装クラス名およびライブラリ名)とコールアウト・パラメータを指定します。

図12-3 コールアウトの作成

図12-3の説明は次にあります。
「図12-3 コールアウトの作成」の説明

それぞれを異なる実装名に割り当てる場合は、同じ名前のコールアウトを複数作成できます。アグリーメントに含まれているコールアウトを削除することはできません。

表12-1に、指定する必要のあるコールアウトの詳細を示します。

表12-1 コールアウトの詳細

フィールド 説明

*実装クラス

クラス・ファイルを.classを付けずに入力します。

注意: Oracle B2Bには、XML-to-XMLトランスフォーメーションのために使用できる、XSLTCalloutImplという名前の事前定義済クラス・ファイルが用意されています。

*ライブラリ名

コールアウト実装クラスがあるJARファイル名を入力します。

注意: 独自のコールアウトJARファイルを1つ以上指定する場合は、ディレクトリの場所を指定する必要があります。 「管理」リンクの「構成」タブを使用します。 Oracle B2Bに含まれているデフォルトのb2b.jarファイルの場合、ディレクトリの場所を指定する必要はありません。

環境間でコールアウト・ライブラリを移行するには、手動で行う必要があります。 B2Bのインポート/エクスポート機能では、コールアウト・ライブラリJARを移行できません。

独自のコールアウトJARファイル用のコールアウト・ディレクトリの指定については、第15.1項「構成パラメータの設定」を参照してください。

bb_calloutdir1.gifの説明は次にあります。
図bb_calloutdir1.gifの説明

説明

説明を入力します。

タイムアウト(秒)

コールアウト処理の制限時間を入力します。


概念的には、コールアウト・パラメータは、特定のコールアウトの使用にのみ適用されるローカル値を割り当てることができる点で、グローバル変数に似ています。また、コールアウト・パラメータを作成して、コールアウトのすべての使用に適用できるデフォルト値に割り当てることもできます。 既存のコールアウトのコールアウト・パラメータを変更すると、そのコールアウトを使用するすべてのアグリーメントが影響を受けます。

表12-2に、オプションのコールアウト・パラメータ属性を示します。

表12-2 コールアウト・パラメータ属性

フィールド 説明

名前

パラメータ名を入力します。

タイプ

整数浮動小数点文字列ブールまたは日付タイプから選択します。 日付タイプの書式はMM/DD/YYYYです。

注意: タイプを変更すると、パラメータのデフォルト値が無効になる可能性があります。

値を入力します。 「暗号化」「TRUE」に設定した場合、この値は暗号化されます。

必須

「TRUE」または「FALSE」を選択します。

暗号化

「TRUE」または「FALSE」を選択します。

説明

任意の説明を入力します。


コールアウトの作成が完了した後は、そのコールアウトをアグリーメントに追加できます。 詳細は、第12.3項「コールアウトのアグリーメントへの追加」を参照してください。 コールアウトをアグリーメントにデプロイした後にそのコールアウトを変更した場合は、サーバーを再起動する必要があります。

コールアウトを作成する手順は、次のとおりです。

  1. 「管理」をクリックし、「コールアウト」をクリックします。

  2. 「コールアウト」セクションで、「追加」をクリックします。

  3. コールアウトの名前を入力します。

    (トランスポート・コールアウトを作成している場合は、そのトランスポート・コールアウトを名前で示すことができます。)

  4. 表12-1の説明に従って、コールアウトの詳細を入力します。

  5. (オプション)「パラメータ」セクションで、「追加」をクリックします。

  6. 表12-2の説明に従って、パラメータ名と属性を入力します。

  7. 「保存」をクリックします。

詳細、パラメータまたはパラメータ値はいつでも編集できますが、コールアウト名を編集することはできません。

12.3 コールアウトのアグリーメントへの追加

図12-4に示されているように、コールアウトの作成が完了した後は、そのコールアウトをアグリーメントに追加できます。

図12-4 アグリーメントでのコールアウトの指定

図12-4の説明は次にあります。
「図12-4 アグリーメントでのコールアウトの指定」の説明

コールアウトをアグリーメントに追加する手順は、次のとおりです。

  1. 「パートナ」をクリックします。

  2. アグリーメント名を入力します。

  3. コールアウトを選択します。

  4. 「保存」をクリックします。

特定のアグリーメントのコールアウト・パラメータ値を更新する手順は、次のとおりです。

  1. 「パートナ」をクリックします。

  2. アグリーメント名を入力します。

  3. コールアウトを選択します。

  4. 「コールアウトの詳細」をクリックします。

  5. パラメータ名の値を入力します(図12-5を参照)。

    図12-5 コールアウトの詳細の入力

    図12-5の説明は次にあります。
    「図12-5 コールアウトの詳細の入力」の説明

  6. 「OK」をクリックします。

12.4 コールアウトの実装

例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);
                }
        }
}