Tomcat5.0.28でUserTransaction

やっとできた.以下,その設定方法.
Tomcat-5.0.28 の $CATALINA_HOME/common/lib に以下のファイルを配備する.


JOTM-2.0.10から commons-logging.jar, connector-1_5.jar, howl.jar, jotm.jar, jotom_jrmp_stub.jar, jta_spec1_0_1.jar, jts1_0.jar, objectweb-datasource.jar, xapool.jar をコピー.
CAROL-2.0.5から ow_carol-all.jar をコピー(JOTM付属のow_carol.jarでうまくいかなかった).
あとお好きなJDBCドライバもコピーする(Oracle10gだったから ojdbc14.jar を使う).

以下の内容の carol.properties を $CATALINA_HOME/common/lib に作成する.

# lmi stands for Local Method Invocation (it's a "fake" RMI)
carol.protocols=lmi
# do not use CAROL JNDI wrapper
carol.start.jndi=false
# do not start a name server
carol.start.ns=false

$CATALINA_HOME/conf/server.xmlに以下のエントリを追加する.

<Resource name="jdbc/TestDS" auth="Container" type="javax.sql.DataSource" />
<ResourceParams name="jdbc/TestDS">
  <parameter>
    <name>factory</name>
    <value>org.objectweb.jndi.DataSourceFactory</value>
  </parameter>
  <parameter>
    <name>url</name>
    <value>DB接続文字列</value>
  </parameter>
  <parameter>
    <name>username</name><value>DBユーザ名</value>
  </parameter>
  <parameter>
    <name>password</name><value>DBパスワード</value>
  </parameter>
  <parameter>
    <name>driverClassName</name>
    <value>oracle.jdbc.driver.OracleDriver</value>
  </parameter>
</ResourceParams>

<Resource name="UserTransaction" auth="Container" type="javax.transaction.UserTransaction" />
<ResourceParams name="UserTransaction">
  <parameter>
    <name>factory</name>
    <value>org.objectweb.jotm.UserTransactionFactory</value>
  </parameter>
  <parameter>
    <name>jotm.timeout</name><value>60</value>
  </parameter>
</ResourceParams>

この段階でTomcatを起動してみてログにこんな感じのメッセージが出るとうまく行ってる証拠(みたい).

2005/12/27 13:01:42 org.objectweb.jotm.Current <init>
情報: JOTM 2.0.10
2005/12/27 13:01:42 org.objectweb.jotm.Jotm <init>
情報: JOTM started with a local transaction factory which is not bound.
2005/12/27 13:01:42 org.objectweb.jotm.Jotm <init>
情報: CAROL initialization
2005/12/27 13:01:42 org.objectweb.carol.util.configuration.ConfigurationRepository init
情報: No protocols were defined for property 'carol.protocols', trying with default protocol = 'jrmp'.
2005/12/27 13:01:42 org.objectweb.jotm.Current <init>
情報: JOTM 2.0.10

設定したDataSourceとUserTransactionを使いたいアプリケーション(WAR)のMETA-INF/context.xmlに,こんな風な記述を追加しとく.

<Context path="/test">
  <ResourceLink global="UserTransaction"
                name="UserTransaction" type="javax.transaction.UserTransaction"/>
  <ResourceLink global="jdbc/TestDS"
                name="jdbc/TestDS" type="javax.sql.DataSource"/>
</Context>

DataSourceのlookupは,こう.

Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/TestDS");

UserTransactionのlookupは,こう.

Context context = new InitialContext();
UserTransaction ut = (UserTransaction)context.lookup("java:comp/UserTransaction");

JNDIの接頭子'java:comp'が鬱陶しい場合は,web.xmlエントリを追加すりゃいいんじゃないかな.
試してみてないけど.:-P
あーっと勘違い.JNDIのENC名で参照するんだからはあるべきなのかも.んでま,こんなのをweb.xmlに追加.

<resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/TestDS</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

ちょっとメンドイ.そいともlookupするとき,「シンプル名でlookupしてダメだったら,ENC名でlookupしてみる」とかしたほうが親切なのかも...うーん,どっちがいいかなぁ.:-(
IBM Developer 日本語版 : IBM Developer: 開発者、技術者、SE、ITスペシャリストのための技術情報 - Japan


ふう,長い旅だった...


ps.
これで一応動いているんで,DataSourceがUserTransactionにバインドされたと思ってんだけど,ちゃんと試してみてるわけではない.
それとは別に,UserTransactionに参加させたくないDataSourceってどう設定するのか皆目検討が付かないので,誰か教えてほしい(他力本願モード).


(追記)ふと思ったんだけど,UserTransactionに参加したくなかったらDataSourceのファクトリをデフォのままにしとけばいいんじゃないだろか?いつか試してみよう.