Java開発者のためのcloud-foundry講座【Part 3 THE NAMESPACE編】

USING CLOUD FOUNDRY SERVICES WITH SPRING: PART 3 – THE <cloud>NAMESPACE(意訳)

(Posted on November 9th, 2011 by Thomas Risberg in 3.1Cloud ComputingCloud FoundryData Access,JavaOpen SourceSpringSpring Data)

前回の投稿したブログUSING CLOUD FOUNDRY SERVICES WITH SPRING: PART 2 – AUTO-RECONFIGURATIONで、Springアプリケーションをデプロイするとき、使われているデータサービスを検出し、自動的にアプリケーションがクラウドサービスが利用できるように再設定いたします。デモとかサンプルアプリケーションなどに利用するには、この上ない素晴らしい機能ですが、本番のアプリケーションなのでは、多分、いくつか自分たち制御したくなるところが増えてくるでしょう。最も、同じタイプのサービス複数利用する場合は自分たちで制御してやらなければなりません。Ramnivas が書いた前回のブログのなかで、いくつかヒントになることが書かれている訳ですが、そこにはCloudRedisConnectionFactoryBean、CloudMongoDbFactoryBeanなどのようなCloud Factory Service Beanを使う場合は、auto-reconfiguration機能を使用しない選択を行うことができます。その選択の方法として一番簡単なものは、利用しようとするサービス定義に<cloud> ネームスペースを用いることです。本ブログではこのネームスペースについてもう少し詳しく説明いたします。

<cloud>ネームスペースが含まれているアプリケーション

アプリケーションのビルド時に、org.cloudfoundry:cloudfoundry-runtimeをディペンデンシー(dependency)として含める必要があります。ビルドにMavenを使っているなら 次のようにpom.xmlのディペンデンシー(dependency)に追加します。

<dependencies>
    <dependency>
        <groupId>org.cloudfoundry</groupId>
        <artifactId>cloudfoundry-runtime</artifactId>
        <version>0.8.1</version>
    </dependency>

    <!-- additional dependency declarations -->
</dependencies>

また、次のようにpom.xmlにSpring Framework Milestone Repositoryを持たせる必要がありますが、単純にこのrepository宣言に追加するだけです。

<repositories>
    <repository>
        <id>org.springframework.maven.milestone</id>
        <name>Spring Framework Maven Milestone Repository</name>
        <url>http://maven.springframework.org/milestone</url>
    </repository>

    <!-- additional repository declarations -->
</repositories>

今、この状態でアプリケーションコンテキストファイルに ネームスペースを記述できるようになりました。実際に、下記の例のようにアプリケーションコンテキストファイルに記述してみます。まず、5行目にネームスペースの宣言を行い、次に8行目にスキーマのロケーションが記述します。10行目で最初の ネームスペース・エレメントを使った定義がされています。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:cloud="http://schema.cloudfoundry.org/spring"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://schema.cloudfoundry.org/spring http://schema.cloudfoundry.org/spring/cloudfoundry-spring-0.8.xsd">

    <cloud:mongo-db-factory id="mongoDbFactory">

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg ref="mongoDbFactory"/>
    </bean>

    <!-- more beans for your app -->

</beans>

このブログでは、すべての有効なネームスペースエレメント及びそれらのオプション設定について説明いたします。

有効なネームスペースエレメント

<cloud:data-source>

<cloud:data-source>エレメントはSpringアプリケーションでJDBC DataSourceの設定をするときに利用できます。次に基本的な属性を説明します。

  • id – デフォルトのサービス名
  • service-name – 複数のデータベースサービスをアプリケーションに接続させるときに必要になります。

JdbcTemplateを注入したDataSourceのシンプルな設定例を下記に示します。このようにdatasource beanをidの属性として指定します。

<cloud:data-source id="dataSource" />

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource" />
</bean>

サブ・エレメントでコネクション及びプールの設定を行うことができます。<cloud:data-source> ネームスペースエレメントは、最も一般的な設定項目をオプションとして<cloud:connection> 及び<cloud:pool> のサブ・エレメントで定義できます。以下の表にサポートされるオプションを説明します。

<cloud:connection> options

Namespace attribute Description Type
properties コネクションに関する項目で、新しいコネクションが確立するときに、JDBCドライバへ送られる。 string

<cloud:pool> options

Namespace attribute Description Type Default
pool-size プールの最大のコネクション数もしくは最小と最大をダッシュで分離する表現がされる範囲 int デフォルトの設定でアパッチコモンズプールを用い、最小0接続と最大8接続が設定されます。
max-wait-time プールの最大接続待ち時間(ミリ秒)、−1のexceptionエラー発生する前に、接続応答が返ってくるまでの最大待ち時間 int デフォルトでアパッチコモンズプールを使い、無制限(-1)の設定がされている。

付加的なオプションが追加されたDataSourceの設定例を以下に示します。

<cloud:data-source id="mydatasource">
    <cloud:connection properties="charset=utf-8;" />
    <cloud:pool pool-size="5-10" max-wait-time="2000" />
</cloud:data-source>

 <cloud:mongo-db-factory>

この <cloud:mongo-db-factory>エレメントは、SpringアプリケーションがMongoDB Connection Factoryに関する設定を行うときに利用されます。次に基本的な属性を説明します。

  • id – デフォルトのサービス名
  • service-name – 複数のMongoDBサービスをアプリケーションに接続させるときに必要になります。
  • write-concern – このWriteConcernはすべてのDBコネクションが作成されたときに使われます(NONE, NORMAL, SAFE, FSYNC_SAFE)。DBコネクションに何もWriteConcernが設定されていない場合は、デフォルトNORMALが設定されます。

write-concernの属性値は、有効な値をcom.mongodb.WriteConcernクラスに持ちます。

Value Description
NONE exceptionの発生及びネットワークの異常も関与しない。
NORMAL ネットワークに関するexceptionは関与するが、サーバのエラーに関する問題は関与しない
SAFE ネットワークに関するexceptionは関与し、サーバのオペレーション待ちに関する問題のみ関与しない
FSYNC_SAFE ネットワークに関するexceptionは関与し、サーバのエラーに関する問題及びデータをディスクにフラッシュする書込みオペレーション待ちに関する問題も関与する

MongoTemplateを注入したMongoDbFactoryのシンプルな設定例を下記に示します。このようにMongoDbFactory beanをidの属性として指定します。

<cloud:mongo-db-factory id="mongoDbFactory" />

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg ref="mongoDbFactory"/>
</bean>

<cloud:mongo-options>のサブ・エレメントの属性として使われるアドバンスな設定を以下の表に示します。

<cloud:mongo-options>

Namespace attribute Description Type Default
connections-per-host 一つのMongoインスタンスに対する最大許容コネクション数。これらのコネクションはプールとして接続を保たれ、コネクションがすべて消費されるとコネクションを要求するオペレーションはブロックされる int Mongoドライバでデフォルト10の値
max-wait-time 一つのスレッドにおけるプールの最大接続待ち時間(ミリ秒) int Mongoドライバでデフォルト120000の値

付加的なオプションが追加されたMongoDbFactoryの設定例を以下に示します。

<cloud:mongo-db-factory id="mongoDbFactory" write-concern="FSYNC_SAFE">
    <cloud:mongo-options connections-per-host="10" max-wait-time="2000" />
</cloud:mongo-db-factory>

<cloud:redis-connection-factory>

この <cloud:redis-connection-factory>エレメントは、SpringアプリケーションがRedis Connection Factoryに関する設定を行うときに利用されます。次に基本的な属性を説明します。

  • id – デフォルトのサービス名
  • service-name – 複数のRedisサービスをアプリケーションに接続させるときに必要になります。

RedisTemplateを注入したRedisConnectionFactoryのシンプルな設定例を下記に示します。このようにRedisConnectionFactory beanをidの属性として指定します。

<cloud:redis-connection-factory id="redisConnectionFactory" />

<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    <property name="connection-factory" ref="redisConnectionFactory"/>
</bean>

<cloud:pool>のサブ・エレメントの属性として使われるアドバンスな設定を以下の表に示します。

<cloud:pool> options

Namespace attribute Description Type Default
pool-size プールの最大のコネクション数もしくは最小と最大をダッシュで分離する表現がされる範囲 int デフォルトの設定でアパッチコモンズプールを用い、最小0接続と最大8接続が設定されます。
max-wait-time プールの最大接続待ち時間(ミリ秒)、−1のexceptionエラー発生する前に、接続応答が返ってくるまでの最大待ち時間 int デフォルトでアパッチコモンズプールを使い、無制限(-1)の設定がされている。

付加的なオプションが追加されたRedisConnectionFactoryの設定例を以下に示します。

<<cloud:redis-connection-factory id="myRedisConnectionFactory">
    <cloud:pool pool-size="5-10" max-wait-time="2000" />
</cloud:redis-connection-factory>

<cloud:rabbit-connection-factory>

この <cloud:redis-connection-factory>エレメントは、SpringアプリケーションがRabbit Connection Factoryに関する設定を行うときに利用されます。次に基本的な属性を説明します。

  • id – デフォルトのサービス名
  • service-name – 複数のRabbitサービスをアプリケーションに接続させるときに必要になります。

RabbitTemplateを注入したRabbitConnectionFactoryのシンプルな設定例を下記に示します。このようにRabbitConnectionFactory beanをidの属性として指定し、<rabbit> のネームスペースに<Cloud>一つを追加した形となります。

<cloud:rabbit-connection-factory id="rabbitConnectionFactory" />

<rabbit:template id="rabbitTemplate"
    connection-factory="rabbitConnectionFactory" />

<cloud:rabbit-options>のサブ・エレメントの属性として使われるアドバンスな設定を以下の表に示します。

<cloud:rabbit-options>

Namespace attribute Description Type Default
channel-cache-size 一つのチャネルで利用されるキャッシュサイズ int デフォルト1の値

付加的なオプションが追加されたRabbitConnectionFactoryの設定例を以下に示します。

<cloud:rabbit-connection-factory id="myRedisConnectionFactory">
    <cloud:rabbit-options channel-cache-size="10" />
</cloud:rabbit-connection-factory>

<cloud:service-scan>

<cloud:service-scan>は、アプリケーションにバイディングされているすべてのサービスをスキャンし、各々のサービスに対し、妥当なBeanタイプを作成します。このエレメントは、Springコアの<context:component-scan>をクラウド用に拡張したものと考えることができます。<cloud:service-scan>は特にアプリケーションの初期の開発フェーズに使うと便利だと思います。新規にサービスをバイディングさせたいときに、<cloud>エレメントをあらたに継ぎ足すことなく、手っ取り早くサービスへアクセスするためのbeanを作成することができます。

@Autowired DataSource dataSource;
@Autowired ConnectionFactory rabbitConnectionFactory;
@Autowired RedisConnectionFactory redisConnectionFactory;
@Autowired MongoDbFactory mongoDbFactory;

一度、<context:component-scan>エレメントをアプリケーションコンテキストに含めるだけで、後は、下記の例のように、Javaコードに各々バイディングしたいサービスに@Autowiredのアノテーションを単純に付加するだけです。 ただ、上記のやり方だと一つのサービスのみに対してそれぞれのタイプでアプリケーションにバイディングする定義になりますが、それ以外、下記のように@Qualifierのアノテーションを使いサービス名を別途、指定することができます。(ここで記述したサービス名で自動的にbeanを作成します。)

@Autowired @Qualifier("inventory-db") DataSource inventoryDataSource;
@Autowired @Qualifier("pricing-db") DataSource pricingDataSource;

ここの例だと、inventoryDataSource BeanとしてInventory-dbサービスにバイディングされ、PriceingDataSource BeanとしてPricing-dbサービスにバイディングします。

<cloud:properties>

有効となる属性を説明します。
  • id – デフォルトのプロパティbean名

この<cloud:properties>エレメントは、Springがサポートしているプレイスホルダープロパティを使ってサービスの基本情報が設定できます。このプロパティフォームについては次回のブログで詳しく説明します。

結論

クラウド・ネームスペースは、クラウドサービスに接続するための簡単な仕組みとしてサポートしています。開発者はローカルなtc/tomcat server、ローカルなクラウド、そしてcloudfoundry.comと同じようにデプロイしたい欲求にかられます。Spring 3.1 profileは、このような欲求に対してテイラーメイドな方法でサポートします。この方法ついてはScott Andrews が次回のブログで説明します。


本ブログの記事は、USING CLOUD FOUNDRY SERVICES WITH SPRING: PART 3 – THE <CLOUD> NAMESPACEの意訳であり、完全な翻訳ではございません。所々、翻訳を省略しているところや、原本にはない文を追加しているところもございます。また、翻訳の正確性が欠ける可能性もございますので、原文にも目を通すことを推奨いたします。ご了承ください。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。