1. チュートリアル

このチュートリアルでは、WebOTX Developer's StudioとWebOTX ESB を使ってサービス統合(システム統合)を実際に体験できます。今、ここに仮想の営業システムと経理システムがあるとして、それらをWebOTX ESBを使って統合することを例に説明します。WebOTX ESBを動作させるのに必要なサービスユニットやサービスアセンブリの作成にWebOTX Developer's Studioを使います。ここでは、このツールを使用した開発から、サービスアセンブリの配備、動作確認までを行います。

Caution
このチュートリアルを実行する前に、WebOTX Developer(Windows版)とWebOTX Enterprise Service Busをインストールした環境を用意してください。

1.1. 統合するサービス(システム)について

これから営業システムと経理システムという2つの別々なシステムをWebOTX ESBをつかって統合します。
システム統合されていないときのイメージ


図1.1-1

WebOTX ESBによる統合後のイメージ


図1.1-2

図のように、システムが統合されていないときは、営業担当者が売上登録した結果の伝票を、経理担当者が手入力により個別に処理することになります。WebOTX ESBによりシステム統合すると、営業担当者も経理担当者もESBに対してアクセスすることになり、各システムはESBにつながることになります。経理担当者は、伝票を受け取らなくても営業システムから売上データを検索し、経理システムに送ることが可能になります。
これからチュートリアルで作成する例では、ESBへアクセスする通信プロトコルをSOAPにします。また、ESBから営業システムへの通信プロトコルをSOAP、経理システムへの通信プロトコルを JMS にします。営業システムには、営業担当者により登録された売上データがあらかじめ登録されており、IDで検索すると該当する売上データを返します。また、経理システムは受け取った計上データ(売上データ)を自身の持つレジストリに書き込みます。
このチュートリアルでは、経理担当者が確認した売上データのIDをESBに送り、ESB側ではまず営業システムからそのIDによって該当する売上データを取得し、売上データを経理システムに送って計上処理を行うというシーケンスを実行します。

Memo
Inboundはサービスを受け付ける側で、Outboundは外部サービスを呼び出す側です。

1.2. 準備

まず、ESBにつなげる2つのシステムとクライアントを準備します。各システム、クライアントのプログラムはすでに作成済みのものを提供しますので、ここではお手元の環境で動作させる作業を行っていただきます。

1.2.1. 経理システム

経理システムは、売上データの計上(経理システムが持つレジストリへの登録)を受け付けるシンプルなJMSクライアントで、WebOTX Developer’s Studioで動作させるJavaアプリケーションです。次の手順でプロジェクトをインポートしてJMSクライアントの動作環境を作り、JMSサーバの設定、JMSクライアントの起動・メッセージ待ち受けを行います。
スタート > すべてのプログラム > WebOTX > Developer’s Studioを起動します。
メニューから、ファイル > インポートを選択します。


図1.2.1-1

一般 >  既存プロジェクトをワークスペースへを選択し、次へをクリックします。


図1.2.1-2

ラジオボタンでアーカイブ・ファイルの選択ONにし、proj_05_JMSQueue.zipを指定し、完了をクリックします。Javaパースペクティブのパッケージエクスプローラーでproj_05_JMSQueueプロジェクトが表示されることを確認します。


図1.2.1-3

Memo
proj_05_JMSQueue.zipは、こちらからダウンロードできます。

まずWebOTXのインストールディレクトリパスの設定を行います。メニューからウィンドウ > 設定を選択します。左側のツリーからJava > ビルド・パス > クラスパス変数を選択します。新規ボタンを押し、名前をAS_INSTALLとしてパスにはWebOTXをインストールしたディレクトリ(例 C:\WebOTX)を指定します。


図1.2.1-4

次いでJREシステム・ライブラリーパスの設定を行います。パッケージエクスプローラから、proj_05_JMSQueueを右クリックしプロパティーを選択します。左側メニューからJavaのビルド・パスを選択し、右上タブからライブラリーを選択します。JREシステム・ライブラリーのアイコンを確認し、赤い×アイコンが表示されている場合は、編集ボタンを押し、ワークスペースのデフォルトJREを選択します。×アイコンが表示されていない場合は、編集は必要ありません。


図1.2.1-5

続いて、JMSサーバの設定を行います。JMSでは、QueueやTopicといった送信先を介してメッセージの受け渡しを行います。JMSが利用する送信先について、物理的送信先と、そのJMSリソースをあらかじめ作成しておく必要があります。本チュートリアルでは、以下の表と手順に従って設定を行います。
表1.2.1-1
要求送信先
応答用送信先
物理的送信先名
MyQueue
JMSBCReplyQueue
送信先リソースJNDI名
MyQueue
jms/JMSBCReplyQueue
コネクションファクトリリソースJNDI名
MyQCF
jms/JMSBCReplyQueueConnectionFactory
運用管理コマンド(otxadmin)を起動します。
> otxadmin
domain1が起動していることを確認します。起動していれば、runningと表示されます。起動していない場合、domain1を起動します。
otxadmin> list-domains
domain1にログインします。domain1はWebOTXインストール時に生成済みのドメインです。ユーザ名パスワードにはドメインログインに使用するユーザ名とパスワードを入力します。
otxadmin> login --user ユーザ名 --password パスワード --port 6212
要求用キューを以下のコマンドによる作成します。使用するキューの物理的送信先をotxadmin create-jmsdest コマンドで作成します。
otxadmin> create-jmsdest --desttype queue MyQueue
このクライアントアプリケーションからJNDI を通してキューをルックアップするために必要な送信先リソースを作成します。
otxadmin> create-jms-resource --restype javax.jms.Queue --wojmsDestinationName=MyQueue MyQueue
JMS サーバへの接続に必要なQueueConnectionFactory を作成します。QueueConnectionFactoryも、クライアントアプリケーションからJNDI を通してキューをルックアップするために必要なコネクションファクトリリソースを作成します。
otxadmin> create-jms-resource --restype javax.jms.QueueConnectionFactory MyQCF

Memo
WebOTX Standard / Enterprise のアドバンスドモードで既にプロセスグループを作成している場合は、プロセスグループを再起動してください。

1.2.2. 経理システム (JMSアプリケーション)

経理システムのJMSアプリケーションの起動・メッセージ待ち受けを行います。

起動には環境に応じて以下の2種類の方法があります。
  1. WebOTX Developer's Studioが利用できる場合
  2. WebOTX Developer's Studioが利用できない場合
(1) Developer's Studioによる起動
  1. メニューから、実行 > 実行の構成(N)を選択し、構成からJavaアプリケーション > 新規(W)をクリックします。
    新規作成してメイン・クラスを検索ボタンからcom.nec.webotx.esb.tutorial.account.AccountSystemを選択し、 プログラムの引数を"MyQueue MyQCF"に設定します。実行(R) をクリックします。


    図1.2.2-1


    図1.2.2-2

  2. 出力の内容を確認します。内容は下記の通りです。


    図1.2.2-3


(2) 起動スクリプトによる起動
  1. 下記のファイルを適当なディレクトリに保存します。
  2. JMSアプリケーションを実行します。
    (Windows環境の場合) runAccountSystem.batを実行します。
     > runAccountSystem.bat
    (UNIX環境の場合) runAccountSystem.shの環境変数 AS_INSTALLObjectSpinner_INSTALL を確認します。 WebOTXのインストールディレクトリが /opt/WebOTX ではない場合、および ObjectSpinnerのインストールディレクトリが /opt/ObjectSpinner ではない場合は、 それぞれ適切に修正してください。確認した後 runAccountSystem.sh を実行します。
     > chmod 777 runAccountSystem.sh
     > ./runAccountSystem.sh
  3. 出力の内容を確認します。内容は下記の通りです。
    looking up MyQCF ...done!!
    creating QueueConnection ...done!!
    creating QueueSession ...done!!
    looking up MyQueue ...done!!
    creating Receiver ...done!!
    Receiver ready!!

1.2.3. 営業システム (Webサービス)

営業システムは、売上データの検索を受け付けるシンプルなWebサービスです。Webアプリケーションとして実装されていますので、次の手順でWebコンテナに配備してください。
配備には環境に応じて以下の3種類の方法があります。
  1. WebOTX Developer's Studioが利用できる場合
  2. WebOTX Developer's Studioがなく、統合運用管理ツールが利用できる場合
  3. WebOTX Developer's Studio、統合運用管理ツールいずれも利用できない場合
(1)Developer's Studioによる配備
  1. Developer's Studioを起動します。
  2. ヘルプメニューからヘルプ目次をクリックします。
  3. 目次から、WebOTX Guide(Enterprise Service Bus) > サンプル集を開きます。 表から proj_05_SoapService をクリックすることでプロジェクトをインポートできます。


    図1.2.3-1

  4. パッケージエクスプローラからプロジェクトを右クリックし、実行 > サーバーで実行 を選択します。
  5. 配備先のサーバーを選択し、配備を行います。
  6. 同様にしてインポートした全てのプロジェクトを配備します。
(2)統合運用管理ツールによる配備
  1. 05_SoapService.war を適当なディレクトリに保存します。
  2. 統合運用管理ツールを起動します。
  3. domain1を右クリックし接続を選択します。ユーザ名、パスワードを入力し接続ボタンをクリックします。
  4. domain1配下のアプリケーションを右クリックしコンポーネントの配備を選択します。
  5. コンポーネントタイプをWebコンポーネントに変更し、参照ボタンから05_SoapService.warを選択します。
    配備ボタンをクリックすると配備が実行されます。
(3)otxadminによる配備
  1. 05_SoapService.war を適当なディレクトリに保存します。
  2. 運用管理コマンド(otxadmin)を起動します。
    > otxadmin
    
    domain1が起動していることを確認します。起動されていれば、runningと表示されます。
    otxadmin> list-domains
    
  3. domain1にログインします。domain1はWebOTXインストール時に生成済みのドメインです。ユーザ名パスワードにはドメインログインに使用するユーザ名とパスワードを入力します。
    otxadmin> login --user ユーザ名 --password パスワード--port 6212
    
  4. 05_SoapService.warを配備します。
    ・WebOTX Standard / Enterprise のアドバンスドモードの場合
    otxadmin> deploy --apgroup <アプリケーショングループ名> --pgroup <プロセスグループ名> <05_SoapService.warへのパス>
    
    ・WebOTX Express または WebOTX Standard / Enterprise のスタンダードモードの場合
    otxadmin> deploy <05_SoapService.warへのパス>
    

1.3. サービスアセンブリの作成

WebOTX Developer’s Studioを起動し、サービスアセンブリの雛形を作成します。サービスアセンブリは、複数のサービスユニットをまとめてJBIコンテナに配備する単位です。サービスアセンブリプロジェクトは、これから作成するいくつかのサービスユニットをまとめるために使用するプロジェクトです。


図1.3-1

サービスアセンブリ内の各サービスユニットは、以下のように連携動作します。
クライアントからの要求を受けた SOAP BC は、サービスユニットに設定した呼び出し先のサービス名とインタフェース名からSequencing SEを呼び出します。Sequencing SEは、サービスユニットに設定した順序でサービスを呼び出します。まず始めに、エンドポイント情報から外部Webサービスを呼び出すSOAP BCを呼び出し、Webサービスからの応答を受け取ります。次に、Sequencing SEのサービスユニットで2番目に呼び出し設定をしたエンドポイント情報から XSLT SEのサービスを呼び出し、外部Webサービスからの応答をJMSが期待するレイアウトに変換します。最後に、Sequencing SEのサービスユニットで3番目に呼び出し設定をしたエンドポイント情報から JMS BC を呼び出します。


図1.3-2

メニューからファイル > 新規 > プロジェクトを選択して、新規プロジェクトダイアログを表示させます。


図1.3-3

新規プロジェクト画面でESB > サービスアセンブリプロジェクトを選択し、次へをクリックします。


図1.3-4

プロジェクト名05_tutorialサービスアセンブリ名05_tutorial名前空間URIhttp://www.nec.comを指定し、完了をクリックします。


図1.3-5

パッケージエクスプローラーで、05_tutorialプロジェクトが追加されたことを確認します。


図1.3-6

1.3.1. 営業システム用のサービスユニットの追加


図1.3.1-1

05_tutorialプロジェクトの05_tutorial.saを開きます。


図1.3.1-2

05_tutorial.saがSAエディタ上で開きます。図の(1)はSAエディタのパレット、(2)はカンバス、(3)はプロパティ・ビューです。


図1.3.1-3

パレット上でSOAPバインディングをクリックし、カンバス上にドラッグします。


図1.3.1-4

カンバス上に下図のようなサービスユニットノードが作成されます。


図1.3.1-5

Memo
エンドポイント名はデフォルトで「ep_05_tutorial_XXX」(XXXは連番)が設定されます。営業システムでは、例として連番001を用います。

カンバス上のサービスユニットノードをダブルクリックします。下図のようなSUエディタが開くことを確認します。


図1.3.1-6

エンドポイント一覧ep_05_tutorial_001をクリックすると、クリックしたエンドポイントの設定画面が表示されます。下記の表に従って設定します。


図1.3.1-7

表1.3.1-1
設定名
設定値
備考
エンドポイントロール
プロバイダ
サービス名
   (名前空間URI)
http://www.nec.com
デフォルトで設定されます。
サービス名
   (ローカル名)
ep_05_tutorial_001
デフォルトで設定されます。
インタフェース名
   (名前空間URI)
http://www.nec.com
デフォルトで設定されます。
インタフェース名
   (ローカル名)
ep_05_tutorial_001
デフォルトで設定されます。
外部Webサービスの
   エンドポイントURL
http://localhost/05_SoapService/05_echo
ホスト名、ポート番号は05_SoapService.warを配備した場所に合わせます。

Memo
サービス名とインタフェース名のローカル名は、エンドポイント名に指定した名前がデフォルトで設定されます。

オペレーション一覧にオペレーションを編集します。オペレーション一覧からデフォルトで登録されているオペレーションを選択して編集をクリックし、表示されたダイアログで、次のように設定を行い、OKをクリックします。


図1.3.1-8

表1.3.1-2
設定名
設定値
備考
オペレーション名
名前空間URI
http://www.nec.com
デフォルトで設定されます。
ローカル名
opr_05_tutorial_001
メッセージ交換モデル
in-out

SOAP Action

空欄です。
受信方向の名前空間URI

空欄です。
送信方向の名前空間URI

空欄です。
Unwrapped Documentの要素
受信方向の要素名

空欄です。
SUエディタの設定を保存して編集画面を閉じます。

1.3.2. 経理システム用のサービスユニットの追加


図1.3.2-1

SAエディタで05_tutorial.saを開き、パレットからJMSバインディングをクリックしてカンバス上へドラッグします。


図1.3.2-2

カンバス上にJMSバインディングのサービスユニットノードが作成されます。


図1.3.2-3

Memo
経理システムでは、例として連番002を用います。

カンバス上のJMSバインディングのサービスユニットノードをダブルクリックします。下図のようなSUエディタが開くことを確認します。


図1.3.2-4

エンドポイント一覧ep_05_tutorial_002をクリックすると、クリックしたエンドポイントの設定画面が表示されます。下記の表に従って設定します。


図1.3.2-5

表1.3.2-1
設定名
設定値
備考
エンドポイントロール
プロバイダ
サービス名
   (名前空間URI)
http://www.nec.com
デフォルトで設定されます。
サービス名
   (ローカル名)
ep_05_tutorial_002
デフォルトで設定されます。
インタフェース名
   (名前空間URI)
http://www.nec.com
デフォルトで設定されます。
インタフェース名
   (ローカル名)
ep_05_tutorial_002
デフォルトで設定されます。
送信先名
MyQueue
経理システムとのやり取りに使うキューのJMSリソース作成時に指定したJNDI名を指定します。
送信先タイプ
Queue
経理システム側は単数のJMSクライアントなのでQueueを選択します。
コネクション
   (コネクションファクトリ名)
MyQCF
JMSのコネクションファクトリ名を指定します。
コネクション
   (ユーザ名)
空欄です。
コネクション
   (パスワード)
空欄です。
メッセージの永続性
persistent
トランザクション
no-transaction
メッセージセレクタ
空欄です。
メッセージ有効期限
空欄です。
優先度
空欄です。
タイプ
空欄です。
相関方法
JMSCorrelationID
タイムアウト
空欄です。
応答用送信先名
空欄です。
応答用コネクション
   (コネクションファクトリ名)
空欄です。
応答用コネクション
   (ユーザ名)
空欄です。
応答用コネクション
   (パスワード)
空欄です。
オペレーション一覧にオペレーションを編集します。オペレーション一覧からデフォルトで登録されているオペレーションを選択して編集をクリックし、表示されたダイアログで、次のように設定を行い、OKをクリックします。


図1.3.2-6

表1.3.2-2
設定名
設定値
備考
オペレーション名
   (名前空間URI)
http://www.nec.com
デフォルトで設定されます。
オペレーション名
   (ローカル名)
opr_05_tutorial_001
デフォルト値(opr_05_tutorial_002)からopr_05_tutorial_001に変更してください。
メッセージ交換モデル
in-only
経理システムは非同期でメッセージを受け取るだけという仕様なのでin-onlyを選択します。
入力メッセージのタイプ
TextMessage
ノーマライズメッセージのコンテント(in側)の内容をJMSで送るのでTextMessageを選択します。
   BytesMessageは添付ファイルを送る場合に選択します。

Memo
JMS BCは、ノーマライズメッセージのコンテントの内容(XML)をTextMessageとして送信します。また、添付ファイルはBytesMessageとしてbyte配列で送信します。 従って、経理システムはTextMessageの形式で送られてくるXMLメッセージを処理できるアプリケーションになっています。

SUエディタの設定を保存して編集画面を閉じます。

1.3.3. XSL変換のサービスユニットの追加


図1.3.3-1

XSLT SEでは、外部Webサービスから受け取った応答をJMSの外部サービス認識できる形式に変換します。XSLT SEを使用する場合は、XSL変換を行うため、ESB開発環境で提供するXMLマッピングツールとの連携機能を利用して、XSLT SEの作成と同時にXSLファイルを生成することができます。
本サンプルの外部WebサービスはXMLファイルの応答を返却しますので、以下のXSDファイルsource.xsdを定義します。
source.xsd
  <?xml version="1.0" encoding="UTF-8"?> 
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.nec.com" xmlns:otx="http://www.nec.com"> 
  <xs:element name="opr_05_tutorial_001Response"> 
    <xs:complexType> 
      <xs:sequence> 
        <xs:element name="ProductData"> 
          <xs:complexType> 
            <xs:sequence> 
              <xs:element name="id" type="xs:string"/> 
                <xs:element name="registDate" type="otx:dateType"/> 
                <xs:element name="deliveryDate" type="otx:dateType"/> 
                <xs:element name="registerName" type="xs:string"/> 
                <xs:element name="productNumber" type="xs:int"/> 
                <xs:element name="productName" type="xs:string"/> 
                <xs:element name="price" type="xs:int"/> 
                <xs:element name="suryo" type="xs:int"/> 
              </xs:sequence> 
            </xs:complexType> 
          </xs:element> 
        </xs:sequence> 
      </xs:complexType> 
    </xs:element> 
    <xs:complexType name="dateType"> 
      <xs:sequence> 
        <xs:element name="year" type="xs:int"/> 
        <xs:element name="month" type="xs:int"/> 
        <xs:element name="date" type="xs:int"/> 
        <xs:element name="hour" type="xs:int"/> 
        <xs:element name="minute" type="xs:int"/> 
        <xs:element name="second" type="xs:int"/> 
      </xs:sequence> 
    </xs:complexType> 
  </xs:schema> 

Memo
source.xsdはソーススキーマファイルです。こちらからダウンロードできます。

JMSサービスでは以下のXSDファイルtarget.xsdを定義します。
target.xsd
  <?xml version="1.0" encoding="UTF-8"?> 
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.nec.com" xmlns:otx="http://www.nec.com"> 
    <xs:element name="opr_05_tutorial_001"> 
      <xs:complexType> 
        <xs:sequence> 
          <xs:element name="ProductData"> 
            <xs:complexType> 
              <xs:sequence> 
                <xs:element name="id" type="xs:string"/> 
                <xs:element name="productNumber" type="xs:int"/> 
                <xs:element name="productName" type="xs:string"/> 
                <xs:element name="price" type="xs:int"/> 
                <xs:element name="suryo" type="xs:int"/> 
                <xs:element name="shoukei" type="xs:int"/> 
              </xs:sequence> 
            </xs:complexType> 
          </xs:element> 
        </xs:sequence> 
      </xs:complexType> 
    </xs:element> 
  </xs:schema> 

Memo
target.xsdはターゲットスキーマファイルです。こちらからダウンロードできます。

XMLマッピングとの連携機能を用いるため、XMLマッピングプロジェクトを用意する必要があります。
メニューから、ファイル > 新規 > その他を選択します。


図1.3.3-2

新規画面で、マッピング > XMLマッピングプロジェクトを選択し、次へをクリックします。


図1.3.3-3

新規XMLマッピングプロジェクト画面で、プロジェクト名mappingを指定し、完了をクリックします。


図1.3.3-4

関連付けられたパースペクティブを開くかどうかの確認画面で、はいをクリックします。


図1.3.3-5

mapping XMLマッピングプロジェクトが作成されることを確認します。


図1.3.3-6

パレットからXSLTエンジンを選択し、カンバスに配置します。


図1.3.3-7

XSLT エンジン上の右クリックメニューマッピング定義 > 新規...を選択します。


図1.3.3-8

新規サービスユニット画面で、新規XMLマッピングファイルONにし、次へをクリックします。


図1.3.3-9

新規XMLマッピングファイル画面で、XMLマッピングファイル・フォルダブラウズをクリックします。


図1.3.3-10

フォルダーの選択画面で、XMLマッピングフォルダーmappingを選択し、OKをクリックします。


図1.3.3-11

新規XMLマッピングファイル画面で、ソーススキーマブラウズをクリックし、ソーススキーマファイルsource.xsdを選択します。ターゲットスキーマブラウズをクリックし、ターゲットスキーマファイルtarget.xsdを選択します。完了をクリックします。


図1.3.3-12

エディタ上に、05_tutorial_XSLTSU_05_tutorial_003.xmf と XSLTSU_05_tutorial_003.su が存在するのを確認します。また、mappingフォルダー配下に05_tutorial_XSLTSU_05_tutorial_003.xmfが表示されていることを確認します。


図1.3.3-13

エディタで05_tutorial_XSLTSU_05_tutorial_003.xmfを開き、下図に示すようにソーススキーマノードとターゲットスキーマノードの間に、線を結んで、マッピングを行います。

ノード間の結線は以下の手順で行います。(1)結線元の矢印をクリック、(2)結線先の矢印をクリック、(3)結線アイコンをクリック。


図1.3.3-14

ソーススキーマノードとターゲットスキーマノードとのマッピング対応は以下の通りです。
表1.3.3-1
ソーススキーマノード
ターゲットスキーマノード
opr_05_tutorial_001Response | ProductData | id | text()  
opr_05_tutorial_001 | ProductData | id | text()
opr_05_tutorial_001Response | ProductData | productNumber | text()  
opr_05_tutorial_001 | ProductData | productNumber | text()
opr_05_tutorial_001Response | ProductData | productName | text() 
opr_05_tutorial_001 | ProductData | productName | text()
opr_05_tutorial_001Response | ProductData | price | text()
opr_05_tutorial_001 | ProductData | price | text(),
opr_05_tutorial_001 | ProductData | shoukei | text()
opr_05_tutorial_001Response | ProductData | suryo | text()
opr_05_tutorial_001 | ProductData | suryo | text()
次に、下図に示すようにprice|text()ノードからshoukei|text()ノードの間の矢印を右クリックし、関数の編集を選択します。


図1.3.3-15

関数の編集画面で関数リストにある「*」をダブルクリックして「./ProductData/price/text()」の後ろに「./ProductData/price/text()*」となるように挿入し、ノードを挿入をクリックします。


図1.3.3-16

ノードの挿入画面でopr_05_tutorial_001Response|ProduceData|suryo|text()を選択し、挿入をクリックします。


図1.3.3-17

関数の編集画面で閉じるをクリックします。


図1.3.3-18

ポップアップダイアログで保存するをクリックします。


図1.3.3-19

05_tutorial_XSLTSU_05_tutorial_003.xmfのエディタでprice|text()ノードからshoukei|text()ノードの間の矢印が緑色になったことを確認します。05_tutorial_XSLTSU_05_tutorial_003.xmfファイルを保存します。


図1.3.3-20

メニューから、XML マッピング > XSL出力を選択します。


図1.3.3-21

XSL出力画面でOKをクリックします。


図1.3.3-22

05_tutorial_XSLTSU_05_tutorial_003.xslファイルを生成したことを確認します。


図1.3.3-23

出力した05_tutorial_XSLTSU_05_tutorial_003.xslファイルは、以下のようになります。
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:S0="http://www.nec.com" xmlns:T0="http://www.nec.com" xmlns:java="http://xml.apache.org/xalan/java" exclude-result-prefixes="java" version="1.0"> 
  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" encoding="UTF-8" indent="yes"/> 
  <xsl:template match="/"> 
    <xsl:for-each select="S0:opr_05_tutorial_001Response"> 
      <xsl:call-template name="node1"/> 
    </xsl:for-each> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001--> 
  <xsl:template name="node1"> 
    <T0:opr_05_tutorial_001> 
      <xsl:call-template name="node2"/> 
    </T0:opr_05_tutorial_001> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData--> 
  <xsl:template name="node2"> 
    <ProductData> 
      <xsl:call-template name="node3"/> 
      <xsl:call-template name="node4"/> 
      <xsl:call-template name="node5"/> 
      <xsl:call-template name="node6"/> 
      <xsl:call-template name="node7"/> 
      <xsl:call-template name="node8"/> 
    </ProductData> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/id--> 
  <xsl:template name="node3"> 
    <id> 
      <xsl:call-template name="node9"/> 
    </id> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/productNumber--> 
  <xsl:template name="node4"> 
    <productNumber> 
      <xsl:call-template name="node10"/> 
    </productNumber> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/productName--> 
  <xsl:template name="node5"> 
    <productName> 
      <xsl:call-template name="node11"/> 
    </productName> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/price--> 
  <xsl:template name="node6"> 
    <price> 
      <xsl:call-template name="node12"/> 
    </price> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/suryo--> 
  <xsl:template name="node7"> 
    <suryo> 
      <xsl:call-template name="node13"/> 
    </suryo> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/shoukei--> 
  <xsl:template name="node8"> 
    <shoukei> 
      <xsl:call-template name="node14"/> 
    </shoukei> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/id/text()--> 
  <xsl:template name="node9"> 
    <xsl:value-of select="./ProductData/id/text()"/> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/productNumber/text()--> 
  <xsl:template name="node10"> 
    <xsl:value-of select="./ProductData/productNumber/text()"/> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/productName/text()--> 
  <xsl:template name="node11"> 
    <xsl:value-of select="./ProductData/productName/text()"/> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/price/text()--> 
  <xsl:template name="node12"> 
    <xsl:value-of select="./ProductData/price/text()"/> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/suryo/text()--> 
  <xsl:template name="node13"> 
    <xsl:value-of select="./ProductData/suryo/text()"/> 
  </xsl:template> 
  <!--template for node /opr_05_tutorial_001/ProductData/shoukei/text()--> 
  <xsl:template name="node14"> 
    <xsl:value-of select="./ProductData/price/text()*./ProductData/suryo/text()"/> 
  </xsl:template> 
</xsl:stylesheet>
次に、05_tutorialプロジェクトのXSLTSU_05_tutorial_003 > XSLTSU_05_tutorial_003.su を開き、設定を行います。


図1.3.3-24

SUエディタで、次の値を設定します。
表1.3.3-2
設定名
設定値
備考
サービス名
   (名前空間URL)
http://www.nec.com
デフォルトで設定されます。
サービス名
   (ローカル名)
ep_05_tutorial_003
デフォルトで設定されます。
インタフェース名
   (名前空間URL)
http://www.nec.com
デフォルトで設定されます。
インタフェース名
   (ローカル名)
ep_05_tutorial_003
デフォルトで設定されます。
エンドポイント名
ep_05_tutorial_003
デフォルトで設定されます。
オペレーション名
   (名前空間URL)
http://www.nec.com
デフォルトで設定されます。
オペレーション名
   (ローカル名)
opr_05_tutorial_001
デフォルト値からopr_05_tutorial_001に変更してください。
説明
空欄です。
サービスID
デフォルトで設定される値を使用してください。
SUエディタの設定を保存して編集画面を閉じます。
05_tutorial.saをSAエディタで開き、上記で作成したXSLTサービスが追加されていることを確認します。


図1.3.3-25

1.3.4. シーケンスの設定


図1.3.4-1

シーケンスを設定して、ESBに統合しているサービス(システム)の実行順序が「クライアントに公開したエンドポイント→営業システム→XSL変換サービス→経理システム」となるように指定します。
SAエディタで05_tutorial.saを開き、パレットからSequeincingエンジンをクリックしてカンバス上へドラッグします。


図1.3.4-2

カンバス上に下図のようなサービスユニットノードが作成されます。


図1.3.4-3

パレットから呼び出すサービスをクリックしてSequencingエンジンのサービスユニットノード上へドラッグします。


図1.3.4-4

Sequencingエンジンのサービスユニットノード上に下図のように呼び出しサービスが追加されたことを確認します。


図1.3.4-5

パレットから接続を選択します。


図1.3.4-6

接続を選択すると、Sequencingエンジン内のサービス要素と、他のサービスユニットとを関連付けることができます。今回のサンプルでは、実行順序が「クライアントに公開したエンドポイント→営業システム→XSL変換サービス→経理システム」となるようにするため、Sequencingエンジン内の1つ目の呼び出しサービス要素と営業システム(SOAP BC)とを接続します。
接続するには、接続を選択後、接続したい要素のアンカーをそれぞれクリックします。


図1.3.4-7


図1.3.4-8

要素同士を接続するとコンシューマの接続情報の更新画面が出るので、はいをクリックします。


図1.3.4-9

同様にしてSequencingエンジン内の2つ目の呼び出しサービス要素とXSL変換サービス(XSLT SE)とを接続します。


図1.3.4-10

同様にしてSequencingエンジン内の3つ目の呼び出しサービス要素と経理システム(JMS BC)とを接続します。


図1.3.4-11

次に、Sequencingエンジンのサービスユニット要素のエンドポイント名(ep_05_tutorial_005)をクリックすると、プロパティビューが開きます。


図1.3.4-12

Memo
シーケンスでは、例として連番005を用います。

プロパティシートが表示されない場合はEclipseのビューをプロパティに切り替えます。
プロパティシートは次の内容で設定します。


図1.3.4-13

表1.3.4-1
設定名
設定値
備考
一般
エンドポイント名
ep_05_tutorial_005
デフォルトで設定されます。
サービス名
名前空間URI
http://www.nec.com
デフォルトで設定されます。
ローカル名
ep_05_tutorial_005
デフォルトで設定されます。
インタフェース名
名前空間URI
http://www.nec.com
デフォルトで設定されます。
ローカル名
ep_05_tutorial_005
デフォルトで設定されます。
その他
説明
空欄で構いません。
Sequencingエンジンのサービスユニット要素のオペレーション名をクリックすると、プロパティビューが開きます。


図1.3.4-14

プロパティシートが表示されない場合はEclipseのビューをプロパティに切り替えます。
プロパティシートは次の内容で設定します。


図1.3.4-15

表1.3.4-2
設定名
設定値
備考
一般
オペレーション名
名前空間URI
http://www.nec.com
デフォルトで設定されます。
ローカル名
opr_05_tutorial_001
デフォルト値からopr_05_tutorial_001に変更してください。
メッセージ交換方式
robust-in-only
SAエディタの設定を保存します。

1.3.5. クライアントに公開するエンドポイントの作成


図1.3.5-1

ESBで統合した1つのサービスをクライアントに公開するエンドポイントを作成します。
サービスユニットの追加を行います。SAエディタで05_tutorial.saを開き、パレットからSOAPバインディングをクリックしてカンバス上へドラッグします。


図1.3.5-2

カンバス上にSOAPバインディングのサービスユニットノードが作成されます。


図1.3.5-3

カンバス上のSOAPバインディングのサービスユニットノードのエンドポイントを選択します。下図のようにプロパティー・ビューでエンドポイントロールをコンシューマにします。


図1.3.5-4

カンバス上でSeqSu_05_tutorial_003のエンドポイントep_05_tutorial_005のオペレーションopr_05_tutorial_001とSOAPバインディングのサービスユニットノードのエンドポイントのオペレーションを接続をします。
コンシューマの接続情報の更新ダイアログのはいをクリックします。


図1.3.5-5

下図のように、SOAPバインディングのサービスユニットノードとシーケンスSeqSu_05_tutorial_003のエンドポイントの間に接続ができます。 また、SOAPバインディングのサービスユニットノードのエンドポイント名とオペレーション名も、SeqSu_05_tutorial_003のエンドポイントとオペレーションと同じ名前に更新されます。


図1.3.5-6

カンバス上のSOAPバインディングのサービスユニットノードをダブルクリックします。下図のようなSUエディタが開きます。


図1.3.5-7

エンドポイント一覧ep_05_tutorial_XXX(XXXは連番)をクリックすると、そのエンドポイントの設定画面が表示されます。


図1.3.5-8

SUエディタで、次の値を設定します。
表1.3.5-1
設定名
設定値
備考
エンドポイントロール
コンシューマ
サービス名
   (名前空間URI)
http://www.nec.com
接続により自動で設定されます。
サービス名
   (ローカル名)
ep_05_tutorial_005
接続により自動で設定されます。
インタフェース名
   (名前空間URI)
http://www.nec.com
接続により自動で設定されます。
インタフェース名
   (ローカル名)
ep_05_tutorial_005
接続により自動で設定されます。
外部に公開する
   エンドポイントURL
http://localhost/soapbc/05_account
ホスト名、ポート番号はsoap_inbound_servlet.warを配備した場所に合わせます。
オペレーション一覧にオペレーションを編集します。オペレーション一覧からデフォルトで登録されているオペレーションを選択して編集をクリックし、表示されたダイアログで、次のように設定を行い、OKをクリックします。


図1.3.5-9

表1.3.5-2
設定名
設定値
備考
オペレーション名
名前空間URI(N)[必須]
http://www.nec.com
デフォルトで設定されます。
ローカル名(O)[必須]
opr_05_tutorial_001
接続により自動で設定されます。
メッセージ交換モデル
robust-in-only
クライアントがESBから受け取るべきメッセージの内容はありませんが、ESBでエラーや例外が起こった内容については受け取りたいためrobust-in-onlyに設定します。
SOAP Action
空欄です。
受信方向の名前空間URI
http://www.nec.com
SUエディタの設定を保存して編集画面を閉じます。
SAエディタの設定を保存します。 SAエディタは下図のようになります。


図1.3.5-10

1.4. サービスアセンブリのデプロイ

サービスアセンブリのZIPファイルを作成し、配備の準備をします。
メニューファイル > エクスポートを選択します。


図1.4-1

ESB > サービスアセンブリを選択し、次へをクリックします。


図1.4-2

プロジェクト05_tutorialを選択すると、出力ファイル05_tutorialと設定されます。このままにしておくと、05_tutorialプロジェクトのルートに05_tutorial.zipが生成されます。その他の場所にしたい場合は、絶対パスを指定してください。ファイル名は05_tutorial.zipにします。最後に完了をクリックします。


図1.4-3

WebOTX ESBをインストールしてあるマシンで、次のコマンドを実行します。
サービスアセンブリを配備します。
・WebOTX Standard / Enterprise のアドバンスドモードの場合
otxadmin> deploy-jbi-service-assembly --apgroup <アプリケーショングループ名> --pgroup <プロセスグループ名> <05_tutorial.zipまでのパス>\05_tutorial.zip
・WebOTX Express または WebOTX Standard / Enterprise のスタンダードモードの場合
otxadmin> deploy-jbi-service-assembly <05_tutorial.zipまでのパス>\05_tutorial.zip
サービスアセンブリを起動します。
otxadmin > start-jbi-service-assembly 05_tutorial

1.5. クライアントの実行

クライアントプログラムを実行して、経理システムに売上が計上されたか確かめます。
実行には環境に応じて以下の2種類の方法があります。
  1. WebOTX Developer's Studioが利用できる場合
  2. WebOTX Developer's Studioが利用できない場合
(1)Developer's Studioによる実行
proj_05_JMSQueueプロジェクトのxmlフォルダにあるregistry.xmlをダブルクリックして開きます。これが、経理システムで売上計上したデータを登録するレジストリです。初期状態では、以下のように<registry/>というルート要素があるのみです。
<?xml version="1.0" encoding="utf-8" ?>
<registry></registry>
内容を確認したら、一旦編集画面を閉じます。
Developer's StudioにWebサービスエクスプローラを用いWSDL定義からメッセージ送受信します。 サンプル集からプロジェクトproj_05_WSDLをインポートします。 パッケージ・エクスプローラから05Account.wsdlを右クリックし、 webサービス > webサービスエクスプローラーでテスト を選択します。


図1.5-1

WebサービスエクスプローラのナビゲータからWSDL操作をクリックしてアクション画面を開き、エンドポイントを選択します。


図1.5-2

ただしWebOTXのWebサーバのポートが80ではない場合、適切なエンドポイントを追加する必要があります。 ナビゲータからWSDLバインディングをクリックしてアクション画面を開き、追加ボタンをクリックし、 エンドポイントを入力しチェックし、Goボタンをクリックしてエンドポイントを追加します。 ナビゲータからWSDL操作のアクション画面を戻して、追加したエンドポイントを選択します。


図1.5-3

WSDL操作の起動画面で追加ボタンをクリックし、テスト文字列1あるいは2を入力し、チェックを入れてGoボタンをクリックします。


図1.5-4

MEPがin-onlyなので、レスポンスが空であることを確認します。 SOAP 要求を参考したい場合は、ソース・ビューに切り替えてください。


図1.5-5

ここで再びregistry.xmlを開くと、以下のように売上計上したデータが追加されています(<keijyouDate>の各要素には、WSDLエクスプローラを実行した日時が出力されます)。
<?xml version="1.0" encoding="utf-8"?> 
<registry> 
  <ProductData> 
    <id>1</id> 
    <keijyouDate> 
      <year>2010</year> 
      <month>4</month> 
      <date>1</date> 
      <hour>12</hour> 
      <minute>30</minute> 
      <second>0</second> 
    </keijyouDate> 
    <productNumber>1</productNumber> 
    <productName>Product_A</productName> 
    <price>1500</price> 
    <suryo>1000</suryo> 
    <shoukei>1500000</shoukei> 
  </ProductData> 
</registry> 
(2) Developerが利用できない場合
起動スクリプトからSOAPクライアントを実行してSOAPメッセージ送受信します。
  1. 下記のファイルを適当なディレクトリに保存します。
  2. SOAPクライアントアプリケーションを実行します。
    (Windows環境の場合) run.batをテキストエディタで開き、SOAPメッセージ送信先のURLを確認します。WebOTXのWebサーバのポートが80ではない場合は適切に修正してください。
    確認した後 run.bat を実行します。
     > run.bat
    (UNIX環境の場合) run.shの環境変数 AS_INSTALLURL を確認します。WebOTXのインストールディレクトリが /opt/WebOTX ではない場合、および WebOTXのWebサーバのポートが8080ではない場合は適切に修正してください。
    確認した後 run.sh を実行します。
     > chmod 777 run.sh
     > ./run.sh
  3. 出力の内容を確認します。内容は下記の通りです。
    ******************************************
    ************  successful  ****************
    ******************************************
  4. 05_Registry.xmlを開いて、<keijyouDate>の各要素に実行した日時が出力されていることを確認します。

以上で、このチュートリアルのシーケンスは動作し、営業と経理のシステム統合が完成しました。

1.6. メッセージログの確認

Memo
本章はテスト用サーバ環境のみの手順です。
メッセージログ機能を設定していない場合や、メッセージログ機能の詳細については2.16. メッセージログ機能の利用を参照してください。

メッセージログ機能を利用して、送信されたメッセージを確認します。
メッセージログ画面を表示するには、Developer's Studioのメニューから ツール > ESB > メッセージログを選択します。


図1.6-1

データベース接続ダイアログが表示されます。ユーザ名、パスワード、スキーマ(空白可)を入力して、接続ボタンをクリックします。


図1.6-2

メッセージログ画面が表示されます。検索開始ボタンをクリックします。


図1.6-3

検索結果が表示されます。このチュートリアルで送信されたメッセージの詳細を確認することができます。


図1.6-4

メッセージログ参照の詳細はWebOTX Enterprise Service Bus「運用ガイド」を参照してください。