JBoss Fuseを使ってみる その3:Webサービス編

2015年4月30日(木)
北東 孝雄

3.WebサービスをCamelルートから呼び出す

「2.CamelルートをWebサービス化する」で作成したそれぞれのWebサービスを、異なるCamelルートから呼び出す手順を説明します。以下の2つを実装します。

  • SOAP Webサービスを呼び出す
  • RESTful Webサービスを呼び出す

ここでもまず、これら2つのCamelルートのためのFuseプロジェクトを作成します。

クライアントFuseプロジェクトの設定

設定
Group Idcom.mycompany(デフォルト)
Artifact Idcamel-archetype-blueprintを選択後、wsclientに変更
Version1.0.0-SNAPSHOT
Package(Group IdとArtifact Idから自動生成)

作成後、不要なクラスやCamelルート、テストコードは削除しておきます。

次にFuseプロジェクト内の「pom.xml」に以下の依存ライブラリ設定を追加します。必ずpom.xml内の ~ 内に記述するようにしてください。

リスト11:pom.xmlに記述する依存ライブラリ

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cxf</artifactId>
    <version>2.12.0.redhat-610379</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>2.7.0.redhat-610379</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>2.7.0.redhat-610379</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxrs</artifactId>
    <version>2.7.0.redhat-610379</version>
</dependency>

SOAP Webサービスを呼び出す

【手順1】WSDLからJavaを生成する

SOAP Webサービスを利用する際には、WSDLからJavaを生成します。まず、事前にWSDLファイルをダウンロードし、wsclientプロジェクト内にインポートしておきます。ダウンロードは、URL「http://localhost:8181/cxf/order/?wsdl」から行います。WSDLからJavaプログラムを生成するツールとして、「wsdl2java」を使用します。pom.xmlの の間に、以下の内容を記述します。

リスト12:pom.xmlに追加する内容

<plugin>
    <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-codegen-plugin</artifactId>
        <version>2.7.0.redhat-610379</version>
        <executions>
                  <execution>
                <phase>generate-sources</phase>
              <goals>
                <goal>wsdl2java</goal>
              </goals>
              <configuration>
                  <sourceRoot>
                      ${project.basedir}/generated
                  </sourceRoot>
                  <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${project.basedir}/src/main/resources/wsdl/OrderEndpointService.wsdl</wsdl>
                        <extraargs>
                              <extraarg>-fe</extraarg>
                          <extraarg>jaxws21</extraarg>
                        </extraargs>
                    </wsdlOption>
                  </wsdlOptions>
              </configuration>
        </execution>
    </executions>
</plugin>

この設定により、「src/main/resources/wsdl/OrderEndpointService.wsdl」から生成されるJavaプログラムが「${project.basedir}/generated」に生成されます。

生成はmvn generate-sourcesで行います。JBDSではFUSEプロジェクトを右クリックし、[Run As]−[Maven generate-sources]で生成されます。以のようなクラスが生成されていることを確認します(図17)。

生成されるJavaコード

図17:生成されるJavaコード

生成されているクラスはそれぞれ以下のようなものになります。

生成されるJavaコード一覧

クラス概要
ObjectFactory.javaJavaとXMLの相互変換を行うためのクラス
Order.javaSOAPリクエストで使用されるXML型を表現するクラス
OrderEndpoint.javaWebサービスのリクエスト・レスポンスのインターフェース
OrderEndpointService.javaWebサービスクライアント。javax.xml.ws.Serviceの拡張クラス
OrderResponse.javaSOAPレスポンスで使用されるXML型を表現するクラス
package-info.javaパッケージ情報

【手順2】Camelルートの中でSOAP Webサービスを呼び出す

Camelルートとして次のような内容を作成します。

SOAPクライアントのCamelルート設定

設定
RouteContainer/wsclient/src/main/resources/OSGI-INF/blueprint
File namesoapClient.xml
FrameworkOSGi Blueprint

Designモード

SOAPクライアントのCamelクライアント

図18:SOAPクライアントのCamelクライアント

リスト13:SOAPクライアントのCamelクライアント(Sourceモード)

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/blueprint"
       xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
       xsi:schemaLocation="
       http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd
       http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
  <cxf:cxfEndpoint id="soapClient"
        address="http://localhost:8181/cxf/order/"
        serviceClass="com.mycompany.wsserver.OrderEndpoint"/>
  <camelContext trace="false" id="blueprintContext" xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="timer:foo?period=30000"/>
        <transform>
            <simple>sample</simple>
        </transform>
        <to uri="cxf:bean:soapClient"/>
        <log message="メッセージ : ${body} "/>
    </route>
</camelContext>
</blueprint>

SOAPサービスを呼び出している箇所は、リスト13の強調されている行です。参照などについてはサーバーサイドと同様の実装になっています。

【手順3】ビルド、インストール、確認

ビルド、インストール、設定の確認方法はこれまでと同様です。インストールの際に設定するArtifact IDが異なる点にご注意ください。

JBossFuse:admin@root> osgi:install -s mvn:com.mycompany/wsclient/1.0.0-SNAPSHOT
Bundle ID: 335

SOAP Webサービスを30秒ごとに呼んでいることを確認します。

JBossFuse:admin@root> log:display -n 2
2015-03-19 19:32:01,483 | INFO  | ault-workqueue-1 | route22                          | ?                                   ? | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | メッセージ : OK : sample
2015-03-19 19:32:31,455 | INFO  | ault-workqueue-2 | route22                          | ?                                   ? | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | メッセージ : OK : sample

RESTful Webサービスを呼び出す

【手順1】Camelルートの作成

まず、以下のようなCamelルートを作成します。

RESTクライアントのCamelルート設定

設定
RouteContainer/wsclient/src/main/resources/OSGI-INF/blueprint
File namerestClient.xml
FrameworkOSGi Blueprint

Designモード

RESTクライアントのCamelルート

図19:RESTクライアントのCamelルート

リスト14:RESTクライアントのCamelルート(Sourceモード)

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
       xmlns:camel="http://camel.apache.org/schema/blueprint"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
       xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd
       http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
  <cxf:rsClient id="restClient"
        address="http://localhost:8181"/>
  <camelContext trace="false" xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="timer:bar?period=40000"/>
        <setHeader headerName="Exchange.HTTP_PATH">
            <simple>/cxf/customer/add/0010/テスト/サンプル/20</simple>
        </setHeader>
        <setHeader headerName="Exchange.HTTP_METHOD">
            <simple>GET</simple>
        </setHeader>
        <setExchangePattern pattern="InOut"/>
        <to uri="cxfrs:bean:restClient"/>
        <log message="REST : レスポンスメッセージ : ${body}"/>
    </route>
</camelContext>
</blueprint>

複数のをGUIで設定していく作業は面倒ですが、Sourceモードでコピーペーストして設定することで、作業負荷を減らすことができます。

RESTサービスを呼び出しているのは、Sourceモード(リスト14)の強調箇所です。注意点として、cxfrsのデフォルトのMessage Exchange PatternはInOnlyなので、そのままの設定ではにおいてログ出力されない点が挙げられます。そこでにおいてMEPをInOutに変更し、レスポンスメッセージを取得するようにします。

【手順2】ビルド、インストール、確認

ビルド、インストール、設定の確認方法はこれまでと同様です。RESTサービスを40秒ごとに呼んでいることを確認します。

JBossFuse:admin@root> osgi:update 335
JBossFuse:admin@root> log:display -n 4
2015-03-19 20:09:59,869 | INFO  | 68 - timer://bar | route23                          | ?                                   ? | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | REST : レスポンスメッセージ : <?xml version="1.0" encoding="UTF-8" standalone="yes"?><CustomerList><customer id="0010"><age>20</age><firstName>テスト</firstName><lastName>サンプル</lastName></customer></CustomerList>
2015-03-19 20:10:19,925 | INFO  | ault-workqueue-3 | route24                          | ?                                   ? | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | メッセージ : OK : sample
2015-03-19 20:10:39,867 | INFO  | p1425932069-1484 | route20                          | ?                                   ? | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 |
2015-03-19 20:10:39,870 | INFO  | 68 - timer://bar | route23                          | ?                                   ? | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | REST : レスポンスメッセージ : <?xml version="1.0" encoding="UTF-8" standalone="yes"?><CustomerList><customer id="0010"><age>20</age><firstName>テスト</firstName><lastName>サンプル</lastName></customer></CustomerList>

4.その他

インターネットを介して利用するようなサービスの中で、主なものは、独自のコンポーネントとして実装されています。

Webサービス関連のコンポーネント

コンポーネント概要
AWSAmazon Web Services連携のための各種コンポーネント。
AWS-CW、AWS-DDB、AWS-S3、AWS-SDB、AWS-SES、AWS-SNS、AWS-SQSなどの各コンポーネントが提供されている
FacebookFacebook連携のためのコンポーネント
GAEGoogle App Engine連携のための各種コンポーネント。
ghttp、gtask、gmail、gauth、gloginなどのコンポーネントが提供されている
SalesforceSalesforce連携のためのコンポーネント
TwitterTwitter連携のためのコンポーネント

Fuseには、Red Hatが提供するPaaS基盤であるOpenShift上で動作するカートリッジ、JBoss Fuse for xPaaSが提供されています。Webサービスを組み合わせて新規サービスを作るような場合、このJBoss Fuse for xPaaSを利用することで、クラウド基盤上で完結したシステムを構築することができます。

5.参考URL

レッドハット株式会社

JBossサービス事業部 JBossコンサルタント
大学にて哲学を専攻後、沖電気工業、日本ティブコソフトウェアを経て、2013年にレッドハットに入社。主にインテグレーション系製品のコンサルティングサービスに従事。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています