Paradigm Shift Design

ISHITOYA Kentaro's blog.

S2BlazeDSの導入

id:higayasuoさんに挑発(?)されてしまったので,人柱.
指摘歓迎.
Teeda+BlazeDSです.はじめに断わっておきますが,私は諸事情によりFlex3を使えないのでFlex2での導入記です.
まだ成功していません…orz

BlazeDSとは

まず,BlazeDSとはというところから.
Home Project for Open @ Adobe / Home / Projectsで公開されていて,要するにJavaのオブジェクトとFlexのオブジェクトを透過的に扱うための仕組み.
S2Flex2との違いは…あまりよくわからないけれど,BlazeDSはAdobe Open Sourceなので公式から出ているものであるというところがちがうのかな.

S2BlazeDSとは

SeasarコンポーネントをBlazeDSで取り扱うためのライブラリ.
ほかのDIコンテナを使っているなら,まずSeasarに乗り換えてください.

BlazeDSのインストール

さすがにTomcatEclipseはインストールされてる前提で.
Adobe - Error PageからBinary Distributionの最新版を落としてきます.


TomcatがないならTurnkeyというオールインワンパッケージをダウンロードするといいみたい.


解凍すると

  • blazeds.war
  • blazed-bin-readme.htm

というファイルができます.
突っ込んでおくと,確かにインストール方法は自明だが,blazed-bin-readme.htmの中にはライセンス条項しか書いていない.READMEじゃなくてLICENCE.


インストール方法は
Home Project for Open @ Adobe / Home / Projects*1
TomcatにBlazeDSをインストールする。 » サイキョウライン
あたりを参考に.

C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps

に放り込むだけでいいです.

S2BlazeDSのサーバー側設定

ライブラリの設定

環境としては,Doltengとか全部入ってる状態を想定しています.
また,最近更新されたMaven - Maven 2.x Integration for EclipseのTycho*2をインストールしてあります.


ChuraのSuper Agile(Teeda+S2Dao)でblazedsTestというプロジェクトを作成.
で,M2EclipseとTeeda - Paradigm Shift Designを参考に,Mavenの設定をします.


…とおもったら,まだMavenで配布されてない*3ので,
S2BlazeDS - Download
から,アーカイブをs2blazeds-1.0.0-rc1.zipをダウンロードして展開.

mvn install:install-file -DgroupId=org.seasar.blazeds -DartifactId=s2blazeds \
-Dversion=1.0.0-rc1 -Dpackaging=jar -Dfile=s2blazeds-1.0.0-rc1.jar

を実行し,ローカルリポジトリにインストールした上で,pom.xmlに

<dependency>
  <groupId>org.seasar.blazeds</groupId>
  <artifactId>s2blazeds</artifactId>
  <version>1.0.0-rc1</version>
</dependency>

と書き加えて保存します.


…さらに,Flex関係のjarもmavenリポジトリにはないようなので,ローカルでインストール.最初にダウンロードしたblazeds.warを解凍して,blazeds/WEB-INF/lib以下のflex-*をローカルリポジトリにインストール.コマンドはさっきと同じように

mvn install:install-file -DgroupId=flex \
                         -DartifactId=flex-messaging-common \
                         -Dversion=3-0-0-544 -Dpackaging=jar \
                         -Dfile=flex-messaging-common.jar
mvn install:install-file -DgroupId=flex \
                         -DartifactId=flex-messaging-core \
                         -Dversion=3-0-0-544 -Dpackaging=jar \
                         -Dfile=flex-messaging-core.jar
mvn install:install-file -DgroupId=flex \
                         -DartifactId=flex-messaging-opt \
                         -Dversion=3-0-0-544 -Dpackaging=jar \
                         -Dfile=flex-messaging-opt.jar
mvn install:install-file -DgroupId=flex \
                         -DartifactId=flex-messaging-proxy \
                         -Dversion=3-0-0-544 -Dpackaging=jar \
                         -Dfile=flex-messaging-proxy.jar
mvn install:install-file -DgroupId=flex \
                         -DartifactId=flex-messaging-remoting \
                         -Dversion=3-0-0-544 -Dpackaging=jar \
                         -Dfile=flex-messaging-remoting.jar

pom.xmlは

<dependency>
  <groupId>flex</groupId>
  <artifactId>flex-messaging-common</artifactId>
  <version>3-0-0-544</version>
</dependency>  
<dependency>
  <groupId>flex</groupId>
  <artifactId>flex-messaging-core</artifactId>
  <version>3-0-0-544</version>
</dependency> 
<dependency>
  <groupId>flex</groupId>
  <artifactId>flex-messaging-opt</artifactId>
  <version>3-0-0-544</version>
</dependency> 
<dependency>
  <groupId>flex</groupId>
  <artifactId>flex-messaging-proxy</artifactId>
  <version>3-0-0-544</version>
</dependency> 
<dependency>
  <groupId>flex</groupId>
  <artifactId>flex-messaging-remoting</artifactId>
  <version>3-0-0-544</version>
</dependency>

と追記します.


あと,commons-httpclientとbackport-util-concurrentが必要なので,pom.xml

<dependency>
  <groupId>commons-httpclient</groupId>
  <artifactId>commons-httpclient</artifactId>
  <version>3.1</version>
</dependency>
<dependency>
  <groupId>backport-util-concurrent</groupId>
  <artifactId>backport-util-concurrent</artifactId>
  <version>3.0</version>
</dependency>

を追記すればライブラリの設定は終わりです.

s2blazedsの設定

S2BlazeDS - Downloads2blazeds-server-example-1.0.0-rc1.zipをダウンロードして,src/main/webapps/WEB-INF/flexを自分のプロジェクトへコピーします.


次にweb.xmlに次の設定を書き加えます.

    <context-param>
        <param-name>flex.class.path</param-name>
        <param-value>/WEB-INF/flex/hotfixes</param-value>
    </context-param>

    <!-- Http Flex Session attribute and binding listener support -->
    <listener>
        <listener-class>flex.messaging.HttpFlexSession</listener-class>
    </listener>


    <!-- MessageBroker Servlet -->
    <servlet>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <display-name>MessageBrokerServlet</display-name>
        <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
        <init-param>
            <param-name>services.configuration.file</param-name>
            <param-value>/WEB-INF/flex/services-config.xml</param-value>
        </init-param>
        <load-on-startup>4</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <url-pattern>/messagebroker/*</url-pattern>
    </servlet-mapping>

S2BlazeDSFlex側設定.

ここでは,サンプルを利用して説明します.
…で,S2BlazeDS - Downloadで配布されているクライアントサンプルをFlex2でインポートしないでください.
インポートするとワークスペースを更新していますというメッセージが,出続けてプロジェクトを閉じることすらできなくなります.
Flex3では問題ないのだと思います.


Flex2では,まずプロジェクトの作成をクリックして
ファイル->新規->プロジェクトで,このFlexアプリケーションはどのようにデータにアクセスしますか?で「Flexデータサービス」,「Flex Builderでアプリケーションをローカルにコンパイル」を選択して次へ.
「ローカルFlexデータサービスのデフォルトの場所を使用する」のチェックを外し,コンテキスト名がblazedsTestなら,

ルートフォルダ:サーバー側プロジェクトのルート/src/webapps
ルートURL:http://localhost:8080/blazedsTest/
コンテキストルート:/blazedsTest

のように設定してください.


で,ビルドパスのoutput folderはサーバー側プロジェクトのルート/src/webapps以下のアプリケーション名を設定.


で,ここまで来て,Flex側でプロジェクトを実行しようとしたら,

Unexpected attribute 'url' found in 'endpoint' from file: services-config.xml.

とか言われる.
Flex3じゃないと動かないのか・・・?*4
と,,hotfixがあるじゃないか!hotfixのくせに151MBもあるじゃないか!…アフォか.
でHotFixをあてる…これ,ほんとにマルっとコピーなんだな.差分じゃない.


これで動くだろーと思ったら,今度は

チャンネル定義 mx.messaging.channels.StreamingAMFChannel が見つかりません。

とのこと.


とりあえずこの辺でタイムリミット.
後で追記します.
DIが効いてないのかなぁ

*1:これをreadmeとして突っ込んでおくべきではないか

*2:隊長としか読めない.きっとあなたも!

*3:4/5現在

*4:今のプロジェクトがFlex2から乗り換えられないので,Flex3で試しても意味がない