ラベル ESB の投稿を表示しています。 すべての投稿を表示
ラベル ESB の投稿を表示しています。 すべての投稿を表示

2010年4月5日月曜日

OSS 11g/JMS Adapter

Oracle SOA Suite 11g で JMS Adapter を使ってみる。

非同期で受け取った SOAP メッセージを、メディエータ経由でJMSにキューイングするルーティングを、コンポジットで実装してみたい。

最初は、BPEL から JMS にキューイングするプロセスを考えたけど、要はコンポジットでのJMS アダプタの設定が肝であって、BPELからのJMS 呼び出しは他の <invoke>と変わらず、Getting Started 目的としては BPEL は蛇足だと気づいて割愛。コンポジットだけで構成した。

■■ JMS キュー作成
以下の3つを Weblogic コンソールで設定する
  • キュー作成
  • コネクションファクトリ作成
  • コネクションプール作成

■ JMS キュー作成
  • Domain Structureで base_domain/Services/Messaging/JMS Modules を選択
  • JMS Modulesで SOAJMSModuleを選択
  • [New] 押下→"Queue"を選択 → [Next]
    • Name: greetingQueue
    • JNDI Name: jms/greetingQueue
  • [Next]
    • Subdeployments:SOASubDeployment
    • Targets/JMS Servers:SOAJMSServer
  • [Finish]


■ JMS Connection Factory 作成
  • Domain Structureで base_domain/Services/Messaging/JMS Modules を選択
  • JMS Modulesで SOAJMSModuleを選択
  • [New] 押下→"Connection Factory"選択 → [Next]
    • Name: greetingCF
    • JNDI Name: jms/greetingCF

  • [Next]→ [Finish]


■ Connection Pool 作成
  • Domain Structureで base_domain/Deployments を選択
  • Deployments テーブルでJmsAdapterを選択
  • Settings for JmsAdapter/Configurationタブ/Outbound Connection Poolsタブ
  • [New]
  • oracle.tip.adapter.jms.IJmsConnectionFactoryを選択して[Next]
    • JNDI Name: eis/Queue/greeting
  • [Finish]※deployment plan location とか言うのを聞かれたら適当にディレクトリを掘って、パスを指定する
  • Configurationタブ/Outbound Connection Poolsタブに戻る
  • oracle.tip.adapter.jms.IJmsConnectionFactory を展開して、eis/Queue/greetingを選択
  • ConnectionFactoryLocation の Property Value に jms/greetingCF を指定
  • [Save]
  • Deployments テーブルに戻って JmsAdapter を再デプロイ(チェックして[Update])


■■ コンポジット・アプリ作成
■プロジェクト作成
  • 名前:ここでは SimpleJmsQueueing とした
  • プロジェクトテクノロジ:SOA
  • コンポジットテンプレート:空のテンプレート

このコンポジットで使う XML スキーマを、以下のように作成。
  • SOAコンテンツ/xsd フォルダのコンテキストメニューから[新規]
  • ファイルを選択し、message.xsdを作成。内容は以下。
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://studies.oss11g/simple.jms.queueing"
    xmlns:tns="http://studies.oss11g/simple.jms.queueing"
    attributeFormDefault="qualified" elementFormDefault="qualified">
    <element name="greeting" type="tns:GreetingType"/>
    <complexType name="GreetingType">
    <sequence>
    <element name="message" type="string" />
    </sequence>
    </complexType>
    </schema>


■ Webサービス
  • Webサービスを[公開されたサービス]のレーンにドロップ
  • 歯車ボタンでスキーマから WSDL を生成
  • リクエストタブでURLに message.xsd の greeting 要素を選択
    レスポンス以下のタブは放置
  • 他はめんどくさいので全部デフォルト


■ JMS アダプタ
  • [外部参照]のレーンにJMS アダプタをドロップ
  • 名前はここではJMS_Queueとした。
  • JMSプロバイダに Oracle Weblogic JMS を指定
  • AppServer 接続:デプロイとかで使ってるいつものやつ
  • アダプタ・インタフェイス:操作およびスキーマから定義
  • 操作:メッセージ発行、操作名はデフォルトまま
  • 発行操作のパラメータ:
    • 接続先名:参照ボタンで greetingQueue を指定
    • JNDI名:eis/Queue/greeting
  • メッセージ
    • URL:message.xsd の greeting を指定
  • 終了


■ メディエータ
  • [コンポーネント]レーンにメディエータをドロップ
  • 名前:デフォルト/テンプレート:デフォルトのまま
  • Mediator1 から Service1 と JMS_Queue にワイアリング
  • Mediator1 の編集開始
    • 「次を利用して変換」の×ボタンを押下
    • 「新規マッパーファイルの作成」を選択して[OK]
  • 開いた XSLT エディタで左の message と右の message をつなげる

■■ テスト
SoapUI か EMコンソールから、いつもどおりにリクエスト送信。キューに入ったメッセージは WebLogic コンソールから確認できる。

2010年1月15日金曜日

Mule/CXF

Mule の CXF を試してみる。 とりあえず ルーティングとか変換は置いといて、まずは単なる一個の Service Component をWebサービスとして呼んでみたい。 ■ 前提 ■ 仕様
  • Mule + CXF でサーバ時刻を得る Web サービス を実装
  • クライアントから与えられた書式で時刻をフォーマットして返す
■ プロジェクト作成
  • Mule Project を新規作成。プロジェクト名は current-time とした。
  • conf 下に current-time-config.xml を書く
    <?xml version="1.0" encoding="UTF-8"?>
    <mule xmlns="http://www.mulesource.org/schema/mule/core/2.2"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:cxf="http://www.mulesource.org/schema/mule/cxf/2.2"
      xsi:schemaLocation="
         http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/mule.xsd
         http://www.mulesource.org/schema/mule/cxf/2.2 http://www.mulesource.org/schema/mule/cxf/2.2/mule-cxf.xsd">
      <model name="currentTime">
        <service name="currentTimeSC">
          <inbound>
            <cxf:inbound-endpoint 
              address="http://localhost:65082/services/currentTimeSC"
              serviceClass="ex1.CurrentTimeService"/>
          </inbound>
          <component class="ex1.CurrentTimeServiceImpl"/>
        </service>
      </model>
    </mule>
  • Java コードは以下のようにした。
    @WebService
    public interface CurrentTimeService {
       @WebResult(name="currentTime")
       public String currentTime(@WebParam(name="pattern") String pattern);
    }
    public class CurrentTimeServiceImpl implements CurrentTimeService {
       @Override
       public String currentTime(String pattern) {
          try {
             return new SimpleDateFormat(pattern).format(new Date());
          } catch (Exception ex) {
             return ex.getMessage();
          }
       }
    }
■ 実行
  • [Run Configurations...]/"Local Mule Server" で以下のように設定
    Namecurrent-time と入力(適当でOK)
    Projectcurrent-time を選択
    Configuration Filescurrent-time-config.xml
  • [Run]押下で実行
◆ soapUI で確認
  • http://localhost:65082/services/currentTimeSC/?wsdl を指定してプロジェクト作成
  • pattern 要素に yyyy/MM/dd HH:mm:ss と指定すると、2010/01/12 16:47:53といった形式で currentTime要素が返される。
  • pattern 要素を変えると、時刻の書式が変わる事も確認できる。
◆ ブラウザ で確認
  • ブラウザ (ここではFireFox 3.5.7を使用)で、URL に http://localhost:65082/services/currentTimeSC/currentTime/pattern/HH:mm:ss を指定すると、以下のような XML が表示される
    <soap:Envelope>
       <soap:Body>
          <ns2:currentTimeResponse>
             <currentTime>16:46:01</currentTime>
          </ns2:currentTimeResponse>
       </soap:Body>
    </soap:Envelope>
    ※REST 風にサービス名、オペレーション名、パラメータ名、パラメータ値 をURLに含めている。

2009年10月23日金曜日

FUSE ESB 3.4 で Drools を使ってみる

最初 FUSE ESB 4.1 でやってみたけど、servicemix-drools コンポーネントを含むサービスアセンブリを osgi:install すると、どうしても osgi:start でエラーが発生する。Drools がルールを構築しようとして NullPointerException を発生させているらしい。

同じ目にあった人が FUSE のコミュニティで質問しているが、どうやら解決には至らなかった模様(リンク)。

リモートデバッガを引っ掛けて見てみると、直接的には Drools の dialect が認識されていないのが原因のようだけど、要するにクラスローダが正しく jar に関連付けられていないらしい。だから例えば、dialect関連のプロパティを-D オプションなんかで無理やり認識させたとしても、次はその dialect に必要なクラスがロードできないと言う事になる。(細かく言うと、jar は drools-compiler-4.0.7.jar、dialect が記述されているファイルは、その jar 中の drools.default.packagebuilder.conf、必要なクラスはJavaDialectConfigurationなど)

その後もしばらく、無理やり ServiceMix の lib に drools 関連の jar を追加してみるなどいろいろ悪あがきしたけど、LinkageError が出たりしてなんだかグタグタになり始め、面倒くさいから中断。実は、FUSE ESB 4.x はまだ incubation フェーズということで、発展途上という風にアナウンスされていたりする。今後に期待。

ということで mature フェーズのFUSE 3.4 を使ってみる事にした。せっかく OSGi 環境が好きになりかけていたんだけどなあ…

■ 概要 以下のように読みこんだファイルをルールに従って仕分けさせてみる
  • file サービス は、フォルダ poller/に xml ファイルが置かれるのを、poller エンドポイントで監視する。
  • file サービス、は xml ファイルが置かれるとこれを読み込み、droolsサービスの dispatch エンドポイント に送る。
  • drools サービス は、<purchase>/<price> 要素が 10000未満ならば、file サービスの sender_low エンドポイントにルーティングし、10000以上ならば file サービスの sender_high エンドポイントにルーティングする。
  • file サービス は、sender_low エンドポイントで受け取ったメッセージをフォルダ low/に保存し、sender_high エンドポイントで受け取ったメッセージはフォルダ high/に置く。
  • file サービス は、poller_low エンドポイントで読み込んだ xml ファイルをフォルダから削除する。
上記動作を、以下のようなモジュール構成で実装してみる
  • trial1-file-su:file サービスを定義するサービスユニット
  • trial1-drools-su:drools サービスを定義するサービスユニット
  • trial1-sa:上の二つのサービスユニットを含むサービスアセンブリ
環境は以下のとおり
  • Windows XP SP3
  • eclipse 3.5
  • FUSE ESB 3.4.0.4
  • アーキタイプのバージョンは基本的に最新版
以下、各モジュールのレシピ。

■ trial1-file-su
  • servicemix-file-poller-service-unit アーキタイプで新規プロジェクト作成
  • xbeans.xml を以下のように編集
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:file="http://servicemix.apache.org/file/1.0"
           xmlns:trial1="urn:net:yasuabe:fuse3"
           xmlns="http://www.springframework.org/schema/beans">
    
      <file:poller service="trial1:file"
                  endpoint="poller"
                  targetService="trial1:drools"
                  targetEndpoint="dispatch"
                  file="file:///c:/devel/tmp/200910fuse/xad/poller" />
      <file:sender service="trial1:file"
                  endpoint="sender_high"
                  directory="file:///c:/devel/tmp/200910fuse/xad/high" />
      <file:sender service="trial1:file"
                  endpoint="sender_low"
                  directory="file:///c:/devel/tmp/200910fuse/xad/low" />
    </beans>
    
■ trial1-drools-su
  • servicemix-drools-service-unit アーキタイプで新規プロジェクト作成
  • xbeans.xmlを以下のように編集
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:drools="http://servicemix.apache.org/drools/1.0"
           xmlns:trial1="urn:net:yasuabe:fuse3"
           xmlns="http://www.springframework.org/schema/beans">
    
      <drools:endpoint service="trial1:drools"
                       endpoint="dispatch"
                       ruleBaseResource="classpath:router.drl"/>
    </beans>
    
  • router.drl を以下のように編集
    package org.apache.servicemix.drools
     
    import org.apache.servicemix.drools.model.Exchange;
    
    global org.apache.servicemix.drools.model.JbiHelper jbi;
     
    rule "cheap"
     when
      Exchange(status == Exchange.ACTIVE, inMsg : in != null )
      eval(inMsg.xpath("/purchase/price<10000"))
     then
      jbi.route("endpoint:urn:net:yasuabe:fuse3:file:sender_low");
      jbi.getLogger().info("cheap");
    end
    
    rule "expensive"
     when
      Exchange(status == Exchange.ACTIVE, inMsg : in != null )
      eval(inMsg.xpath("/purchase/price>=10000"))
     then
      jbi.route("endpoint:urn:net:yasuabe:fuse3:file:sender_high");
      jbi.getLogger().info("expensive");
    end
    
■ trial1-sa
  • servicemix-service-assembly アーキタイプで新規プロジェクト作成
  • pom.xmlを編集して以下のような dependencies にする
  •   <dependencies>    
        <dependency>
          <groupId>net.yasuabe.fuse3</groupId>
          <artifactId>trial1-drools-su</artifactId>
          <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
          <groupId>net.yasuabe.fuse3</groupId>
          <artifactId>trial1-file-su</artifactId>
          <version>0.0.1-SNAPSHOT</version>
        </dependency>
      </dependencies>
    
■ ビルドして動かしてみる
  • ビルドは Eclipse 上で [mvn install]した
  • デプロイは maven の jbi:projectDeploy ゴールを試したが、この質問(→リンク)と同様に Repository が見つからない現象が再現したので、意地を張るのは止めて hotdeploy を使ってデプロイすることにした。
  • で、次のように確認
    • 以下のようなファイルを poller に置いて、low に移動することを確認した。
      <?xml version="1.0" encoding="UTF-8"?>
      <message>
       <amount>9999</amount>
      </message>
      
    • 以下のようなファイルを poller に置いて、high に移動することを確認した。
      <?xml version="1.0" encoding="UTF-8"?>
      <message>
       <amount>10000</amount>
      </message>
      
    • どちらでもログが出力されることを確認した。
■ その他メモ
上記の試行はfile コンポーネントとdrools コンポーネントだけのものだけど、他にもいろいろな組み合わせを試したので、困った事・分かった事を書いておく。

・servicemix-drools コンポーネントの挙動が分かりにくい
Camel のルーティングの from() にタイマやファイル監視を指定、to() に Droolsサービスを指定するような設定で、Drools から返ってこないまま止まっている感じになる事があった。この場合、例えば タイマなら3秒に一回メッセージが来るはずが、二つ目以降のメッセージが流れて来ず、ファイル監視なら処理の終わりで削除されるはずのファイルがロックされたまま消されずに残っているといった状況。jbiHelper の answer()やroute()、あるいは fault()のようなメソッドを呼ばないと返らないのかも。

・JMS が大量にソケットを消費して、しまいにポート 61616(JMSのコネクション)につながらなくなる
(java.net.BindException) ここでレポートされている(→リンク)のと同様の現象。
試しに Spring で最大コネクション数1のコネクションプールを指定してみると、キューイングしたところで、最初のキューイングで JMS が固まっている。という事はプール不使用の場合は新たなコネクションを作り続けて限界に達しているという事か。だけど、そもそも何故そんなに何百回も接続しようとするのか分からない。
ちなみに上のリンクでは、結局 ActiveMQ と Camel を subversion のトランクから落としてリビルドしたようだけど、面倒だからパス。と言うわけで、上述のレシピのように、JMS の代わりにfile:sender を用いることにした。
いろいろ不可解な現象があったり情報が少なかったり、面倒くさいことがちょっと多かったけど、まあ手間がかかった分わかった事も多いので、良しとしよう。

終わり

2009年10月21日水曜日

ServiceMix Tutorial を FUSE ESB 4.1で

ServiceMix のサイトにあるチュートリアルと同じ事を、Eclipse(3.5.0) と FUSE ESB(ServiceMix4)を用いてやってみる。(ServiceMix のバージョンは、4.1.0.2-fuse)

■ 概要
「あるディレクトリを監視して、ファイルが置かれたら別のディレクトリに移動する。」という、極々シンプルな仕様。流れとしては、まずservice unit、service assembly の順に作成し、これをServiceMixにインストールして動作確認するだけ。至って簡単。

■ service unit
ファイルの監視と移動にはservicemix-file コンポーネントを用いる。servicemix-file の動作は、service unit で定義するが、これを以下のように eclipse プロジェクトとして作成する。
  • [New]>[Project...]で [Maven Project]を選択
  • Archetype の選択で "Nexus Indexer"カタログから"servicemix-service-unit"を指定 (無ければ Maven Indexビューで"http://repo.fusesource.com/maven2-snapshot" か"http://repo.fusesource.com/maven2"を追加するとリストアップされるようになる。)
  • Artifact Id 等は説明の都合上以下のようにする。
    • Group Id:org.apache.servicemix.tutorial
    • Artifact Id:tutorial-file-su
    • Version:0.0.1-SNAPSHOT
    • Package:org.apache.servicemix.tutorial.tutorial_file_su
次に以下のようにpom.xmlを編集する。
  • project/dependenciesに、以下のように servicemix-file への dependency を追加する。(JUnitのdependency はいらないので消す。)
    <dependency>
        <groupId>org.apache.servicemix</groupId>
        <artifactId>servicemix-file</artifactId>
        <version>2009.03-fuse-SNAPSHOT</version>
    </dependency>
    
  • project/name要素 を "Tutorial :: File SU"に変更

また以下のように xbean.xml を作成する
  • src/main/resources直下に xbean.xml を作成する
  • 内容は以下のように記述する
    <beans
            xmlns:file="http://servicemix.apache.org/file/1.0"
            xmlns:tut="urn:servicemix:tutorial"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <file:sender service="tut:file" endpoint="sender"
             directory="file:///c:/tmp/gert/sender"/>
        <file:poller service="tut:file" endpoint="poller"
             file="file:///c:/tmp/gert/poller" targetService="tut:file"
             targetEndpoint="sender"/>
    </beans>
  • sender@directory にはコピー先のディレクトリパス、poller@file には監視対象のディレクトリパスを記述する
  • Windows 環境でドライブレターを含む場合、上記のように"file:///c:/tmp/poller/"みたいに書く
  • servicemix-file の細かいことは、元サイトを参照
これを次のようにビルドする。
  • [Run As]>[Maven install]
  • 成果物がローカルリポジトリにインストールされるが、確認するには eclipse のMaven Indexビューで local リポジトリを見ればいい。
■ service assembly
service unit を使うには service assembly に組み込んで ServiceMix に配備するが、service assembly も 以下のように eclipse プロジェクトとして作成する。
  • [New]>[Project...]で [Maven Project]を選択
  • Archetype の選択で "Nexus Indexer"カタログから"servicemix-service-assembly"を指定
  • Artifact Id 等は説明の都合上以下のようにする。
    • Group Id:org.apache.servicemix.tutorial
    • Artifact Id:tutorial-sa
    • Version:0.0.1-SNAPSHOT
    • Package:org.apache.servicemix.tutorial.tutorial_sa
次のように pom.xml を編集。
  • project/dependencies に、上で作成・インストールした service unit を指定する。
    <dependencies>
       <dependency>
         <groupId>org.apache.servicemix.tutorial</groupId>
         <artifactId>tutorial-file-su</artifactId>
         <version>0.0.1-SNAPSHOT</version>
       </dependency>
     </dependencies>
    
  • project/name を "Tutorial :: SA"に変更
これを [Run As]>[Maven install] でビルドする。確認は service unit と同様

■ インストールと動作確認
  • ServiceMix コンソールから次のコマンドでインストール。-s オプションがあるので自動的にスタートする。
    osgi/install -s mvn:org.apache.servicemix.tutorial/tutorial-sa/0.0.1-SNAPSHOT/zip
  • osgi/list で、最終行に以下のような行があることを確認。
    [ 175] [Active     ] [       ] [   60] mvn:org.apache.servicemix/tutorial-sa/0.0.1-SNAPSHOT/zip
  • nmr/list で以下の行が含まれている事を確認
    {urn:servicemix:tutorial}file:sender
    {urn:servicemix:tutorial}file:poller
  • jbi/list で以下の行が含まれている事を確認
    [Started ] [tutorial-sa                     ]     FUSE TRIAL1 :: SA
  • c:/tmp/gert/poller に適当なファイルを置いて、自動的にc:/tmp/gert/sender に移動される事を確認
終わり。

2009年10月20日火曜日

観察:Getting Started with FUSE 4 (2)

前回前々回に続いて、FUSE の webinar 「Getting Started with FUSE 4」の復習。

payment-service-bc

■beans.xml の編集
cxfbc:consumer 要素を使っている。詳細は[ここ] 他は、payment-service-se の beans.xml と同様。 ちなみに、webinar では soapUI を使って SOAPメッセージを送っているが、 payment-service-se 中の PaymentServiceクラス(自動生成されたやつ)を使えば、以下のようなコードでWebサービスの動作確認ができる。
public static void main(String[] args) {
    ObjectFactory factory = new ObjectFactory();

    Transfer payload = factory.createTransfer();
    payload.setAmount("123");
    payload.setFrom("Me");
    payload.setTo("You");
   
    PaymentService service = new PaymentService();
    Payment endpoint = service.getSoap();
    Response response = endpoint.transferFunds(payload);

    System.out.println(response.getReply());
}

payment-service-batch

■ プロジェクトを生成した直後の状態
servicemix-osgi-camel-archetype を使って、以下のようなファイルを含むプロジェクトの雛形を作成。
  • src/main/java/com/example/fuse/payment_service_batch2/MyTransform.java route の中で使用する Javaクラス のスケルトン。使わないのでsrc/main/javaごと削除する。
  • src/main/resources/META-INF/spring/camel-context.xml camel のルーティング。後で編集する
  • pom.xml maven の設定ファイル。後で編集する。

■ camel-context の編集
camelContext 要素内で、route が二つ定義されている。
  • まず一つめ
    • FUSEホーム直下の tmp/file-in フォルダにおかれたファイルを読み込む
    • それを文字列にする
    • 読んだ文字列をログに出力する
    • 読んだ文字列を XMLとして解釈し、XPATH式 transfers/transfer の要素を、ログ出力すると同時に、JBIの
    • paymentService:endpointに送る
  • 二つめ
    • 2秒ごとのタイマーイベントに応じて
    • CDATA で定義した内容をメッセージボディとし、
    • それをログに出力し、
    • ファイル名を transfer.xml とするよう宣言し、
    • FUSEホーム直下の tmp/file-in に保存する

==== ====
だいたい webinar の内容はわかった。

SeriviceMix 3.X までは、仕事でも私用でも以前から若干経験があったけど、ServiceMix4で OSGI ベースになってから、使い方が大幅に変わったり、以前の資料の大半が使えなくなったりしてちょっと敬遠していたけど、まあ、なんとかなりそう。

むしろ昔より使いやすいかもしれない。提供されている maven アーキタイプに逆らわずに、自然な流れをキープすることに留意すれば、わりと良い生産性が見込めるかもしれない。 ただやはり、情報や資料が少なすぎるのは、リスクになるかも。

2009年10月19日月曜日

観察:Getting Started with FUSE 4 (1)

この間の続き。[前回]

payment-service-se、payment-service-bc、payment-service-batch と、webinarで作成する三つのプロジェクトのうち、まず最初の payment-service-se を少し詳しく見てみる。流れは README.txtに書いてある手順に従う。

プロジェクトを生成した直後の状態
M2 のアーキタイプ servicemix-osgi-cxf-wsdl-first-archetype が、Maven 2 の規約に従ったディレクトリ構成で、以下のようなファイルを自動生成している。
  • src/main/resources/META-INF/spring/beans.xml
    後で内容をリプレスする
  • src/main/resources/wsdl/person.wsdl
    別のwsdlを使うので削除する
  • pom.xml
    maven の設定ファイル。後で編集する。


paymentService.wsdl のインポート
WSDL定義の内容は、以下のようなもの
  • サービス PaymentServiceはポートsoap を持つ
  • ポート soap のポートタイプ は Paymentである。
  • ポートタイプ Payment は、操作 transferFundsを持つ。
  • 操作 transferFunds の入力はメッセージ TransferRequest であり、出力はメッセージTransferResponseである。
  • メッセージTransferRequest は XSD型 transferに、メッセージTransferResponseは、XSD型 responseに関連付けられている。


■pom.xmlの編集
  • プロジェクト名は OSGIバンドルの名前としても用いられ、ServiceMix 上でもこの名前で表示される

  • Dependencies で設定するモジュールは、Payment サービスの実装クラス PaymentImpl で使うもの
  • cxf-codegen-plugin は wsdl からコードを生成するために用いる。wsdlファイル名とソース生成先を変更。
  • maven-bundle-plugin は OSGI バンドルを作るmaven プラグイン。詳細はここ


■maven install
maven install を実行してソースを自動生成する。webinar では「install」だが「cxf-codegen:wsdl2java」ゴールでも可。以下のように pom.xml で指定したフォルダtarget/generated/main/java下に、ソースファイルが生成される。
  • com.example.fuse.payment_service
    Payment…paymentService.wsdl に書かれた wsdl:portType 定義に対応するインターフェイス
    PaymentService…クライアントスタブ
  • com.example.fuse.payment_service.types
    Transfer…paymentService.wsdl 中のtransfer型 に対応するJavaクラス
    Response…paymentService.wsdl 中のresponse型 に対応するJavaクラス
    ObjectFactory・・・Transfer とResponseのファクトリクラス
    package-info・・・パッケージとXML名前空間を対応付ける


■Paymentインターフェイスの実装
PaymentImplクラス で Payment インターフェイスと InitializingBean を実装する。
  • transferFunds()メソッドで、入力メッセージをログ出力し「OK」を出力メッセージに設定する
  • SpringのInitializingBeanでもあるので、afterPropertiesSet()に確認のためのログ出力コードを書いておく
  • setContext()メソッドは Spring からインジェクタメソッドとして呼ばれる


■spring のbean.xml の編集
  1. エンドポイントでの実際の処理を行うクラスとして PaymentImpl クラスを指定する。
  2. EndpointExporter に PaymentImpl を登録させる
  3. 他の編集箇所は、上記1,2のためのリソースや名前空間の準備。


プロジェクトpayment-service-seは、以上のような感じ。

追試:Getting Started with FUSE 4

FUSE という ServiceMix のバンドルを試してみたので、以下にレポート。

ネタはこのサイト(→リンク)で配信されている、Getting Started with FUSE 4 という webinar セッション。動画はローカルに保存した方が見やすいので、指定のサンプルファイルと共にローカルに落としておく。

基本的には、ダウンロードしたファイル群に含まれる README.txt に手順が一通り書いてあり、それだけを見ながらできない事もないが、一応、Webinar動画の方も見ておいた方がいい。

ツール・ライブラリ等について、敢えて webinar と少しだけ違うバージョンのものを、使えるところは使ってみたので、以下に書いておく。
FUSE4.1.0.2
Eclipse3.5.0
soapUI3.0.1
servicemix-osgi-cxf-wsdl-first-archetype2009.03-fuse-SNAPSHOT
jbi-api-1.01.3.0.2-fuse
commons-logging1.1.1
spring-beans2.5.6
cxf-codegen-plugin2.2.2.2-fuse
camel-version1.6.1.0-fuse

いくつか問題が発生したが、以下のようにして解決。
■ settings.xml が見つからなくて、maven index が更新されない

Window>Preference>>Maven>Installations>User Settingsで正しいパスを指定

■ Javaコードで、コンパイルエラー(Access restriction)
コンパイラセッティングを変更する→参考リンク

■ インストールした BC/SE の start で失敗
pomを以下のように変更
× org.apache.cxf.cxf-bundle
org.apache.cxf.bundle

これで webinar の実演どおりの結果が得られる。

以下は小技。
  • ServiceMix のコンソールからlog/displayでログが見られるが、大して便利なものでもなく、普通に、別途コマンドプロンプトを開いて tail で log を流しておく方がマシ。ログファイルの場所は、FUSEフォルダ下の data/log/servicemix.log
  • ServiceMixに eclipse のリモートデバッガを引っ掛けるには、環境変数SET SERVICEMIX_DEBUGにTRUEを設定しておく。参考リンク