Azure上のテストコードの整理 ついでにWorkerRoleから起動したTomcatで、JDBCを使ってSQL Azureへ接続

少しAzure上のテストコードの整理をしました。
別々に作っていたプロジェクトを統合したりして。
今は、WebRole上でphpも動くし、WorkerRoleからTomcatの起動もするものをあげています。
http://usaxusa.cloudapp.net/


っで、phpTomcat(WorkerRoleから別アプリケーションの起動)の設定について、ちょっと(・∀・)

WebRoleでPHP(再)

以前の設定とは少し違う箇所があって、パスの指定にはapprootをつける必要があります。
こんな感じですね。

  • Web.roleconfig
<?xml version="1.0"?>
<configuration>
  <system.webServer>
    <fastCgi>
      <application fullPath="%RoleRoot%\approot\php\php-cgi.exe" />
    </fastCgi>
  </system.webServer>
</configuration>
  • Web.config
<?xml version="1.0"?>
<configuration>
  <system.web>
    <handlers>
...
      <add name="FastGGI Handler"
           path="*.php"
           verb="*"
           modules="FastCgiModule"
           scriptProcessor="%RoleRoot%\approot\php\php-cgi.exe"
           resourceType="Unspecified" />

WorkerRoleからTomcat

基本的なやりかたはWindows Azure Tomcat Solution Acceleratorがやってることに同じです。
っというか、それを参考にして構成(・ω・)


概略を説明すれば、TomcatjreをWorkerRoleのプロジェクトにコピーしてデプロイ対象に含めて。
WorkerRoleでの処理としては、まずTomcatでlistenするポートをWorkerRoleのエンドポイントのポート(RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["XXX"].IPEndpoint.Port)にあわせてserver.xmlを書き換えて。
次に、Tomcatのstartup.batを使ってプロセスを起動という流れ。


一点はまったのが、空のディレクトリがデプロイ対象に含まれず、Tomcatが正しく起動しなかったという点(´д`;)
とりあえず、空のディレクトリについてはemptyファイルを作成して対応。
この辺、Windows Azure Tomcat Solution Acceleratorはコマンドラインからバッチでパッケージを作る設定になっていて問題無いんだよね(・ω・)


っで、Tomcatに限らずXCOPYインストール&起動オプションでポートを指定できるサーバアプリケーションなら、比較的簡単にWorkerRoleから動かせるんじゃないでしょうか(・∀・)?


そしてこれが実行中のTomcat
http://usaxusa.cloudapp.net:8080/
まあ、これだけだとJavaが動いているのかどうか判りづらいですが(´д`;)
jspも直接見せてないし、Strutsを使ってるけど*.doも見せていないし。
とりあえずHTTPヘッダを見れば、レスポンスが「Server: Apache-Coyote/1.1」な事は確認できますが(´д`)


んで、ついでにJDBCSQL Azureを使う処理も入れてみた。
http://usaxusa.cloudapp.net:8080/sql/
基本的に他からパチクってきた処理で構成しただけなので、特別な事は何もやっていないですが。
ちなみに、使用しているのはJRE 1.6とSQL Server JDBC Driver 2.0中のsqljdbc4.jar。
あと、Springを使っていて、DataSourceの設定はこんな風にしていて。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
  <property name="url" value="jdbc:sqlserver://servername.database.windows.net;databaseName=DatabaseName"/>
  <property name="username" value="username@servername"/>
  <property name="password" value="password"/>
</bean>

ただ、最初にテストしていた時は、ローカルPCからのJDBC接続は問題が無くても、Azure上にあげたらConnection resetで接続できないという問題が発生していて
それはよくわからないけど解消したんですが(´д`;)


…っというか、今も時々エラーが発生しますね(´д`;)?(エラーが表示されたらF5してみて)
コネクションプールの初回接続時かな、DataSourceのパラメータを弄れば状況は変わるかしら?



っで、その他の注意事項を一点。
今回作ったService Package file、PHPの分で30MB、Tomcatの分で60MB、その他アプリやwarの分も含めてサイズが150MBを超えているんですが。
なんかWebからアップロードしてデプロイしようとすると、エラーが発生するようになってしまい(´・ω・`)
一端Blobにあげて、そっちからデプロイすれば大丈夫っぽいので、今はそうしています。


追記

Connection resetの問題。
気がついたんだけど、SQL Azureタイムアウトでコネクションが切られているからじゃね( ゚д゚)?
っということで、DataSourceにこんな設定を追加してみる。

<property name="testOnBorrow" value="true"/>
<property name="validationQuery" value="select 1"/>

とりあえずエラーは発生しなくなったくさい。
ただ、これだったらむしろプールしない方が良かったりして(´д`;)?

オマケ

telnetでusaxusa.cloudapp.net:9999に接続してみると…。
これは明日の日記で(・∀・)