- PR -

UserTransactionが返らず困っています

投稿者投稿内容
Yaksa
会議室デビュー日: 2005/01/11
投稿数: 6
投稿日時: 2005-01-11 10:15
はじめまして。
現在Tomcat5.5で開発を行う過程においてUserTransactionが
返らずに困っています。
(コメントを入れている通りにReferenceableインターフェイスが戻されています。)
参照したWebサイトの歴々では特別な設定など要らないように見え、ほぼ参考通りに設定したのですが何かお気づきの点などありましたらご教示願います。
参照先では特にnarrowメソッドを使わずともキャストできるように書かれていました
Namingによって呼ばれるFactoryであるUserTransactionFactoryのgetObjectInstance
を見てもorg.objectweb.jotm.Currentが返るようになっているので正しく思うのですが
何が悪いのやらさっぱりです。sever.xmlのResource記述も特におかしくはないと思っているのですが?

<server.xml抜粋>

<GlobalNamingResources>
<Resource auth="Container" description="" name="UserTransaction" type="javax.transaction.UserTransaction" factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60"/>
</GlobalNamingResources>
<Context displayName="My JTA Examples" docBase="C:/eclipse-SDK-2.1.2-win32/eclipse/workspace/MyJta/jta" path="/MyJta" reloadable="true" workDir="C:\eclipse-SDK-2.1.2-win32\eclipse\workspace\MyJta\work">
<ResourceLink global="UserTransaction" name="UserTransaction"/>
</Context>

以下取得するソース部分(抜粋)
public static UserTransaction getUserTransaction() throws NamingException {
Object obj = lookup("java:comp/UserTransaction");
//org.objectweb.jotm.Currentに見える 正しく見えなくもないが
System.out.println("Log:" + obj.getClass());
/*
* 調査結果によりReferenceableのインスタンスを持っていた為、
* キャストして内包するものを確認してみた。
*/
Referenceable refer = (Referenceable)obj;
Enumeration em = refer.getReference().getAll();
while(em.hasMoreElements()) {
Object ob = em.nextElement();
//server.xmlに与えたParameter jotm.timeoutが出力される
System.out.println("Log:" + ob.toString());
}
//org.objectweb.jotm.Currentに見える 正しく見えなくもないが
System.out.println("YaksaLog:" + refer.toString());
//何も変換などしていないのでClassCastException
UserTransaction ut = (UserTransaction)narrow(obj, UserTransaction.class);

return ut;
}
/**
* コンテキストより指定された名前でのルックアップを行い、取得されたオブジェクトを返します
* @param name
* @return
* @throws NamingException
*/
public static Object lookup(final String name) throws NamingException {
Object result = null;
try {
InitialContext context = new InitialContext();
result = context.lookup(name);
} catch(NamingException ne) {
throw ne;
}
return result;
}
static private Object narrow(final Object obj, final Class clazz) {
/*
* ここでClassCastExceptionが発生--org.omg.CORBA.Objectへのキャストが原因か
*/
return PortableRemoteObject.narrow(obj, clazz);
}




[ メッセージ編集済み 編集者: Yaksa 編集日時 2005-01-11 14:33 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-01-12 01:20
最近の事情は知らないんですが、Tomcat って JTA サポートしてましたっけ?
http://www.theserverside.com/discussions/thread.tss?thread_id=30150
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-01-12 12:22
引用:

インギさんの書き込み (2005-01-12 01:20) より:
最近の事情は知らないんですが、Tomcat って JTA サポートしてましたっけ?
http://www.theserverside.com/discussions/thread.tss?thread_id=30150


Tomcat自体はサポートしていません。この場合はJOTMというJTA実装を使っているのだと思います。
とりあえず、JOTMをどのようにセットアップしたのか、Tomcatのログに何か出ていればそれを
書いた方がいいと思います。
Yaksa
会議室デビュー日: 2005/01/11
投稿数: 6
投稿日時: 2005-01-12 13:42
JOTMはダウンロードされたlibの中身をCATALINA_HOME/common/libにコピーしました。
以下は発生したログファイルの中身です。

Log:class org.objectweb.jotm.Current
java.lang.ClassCastException
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:229)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
at JtaResourceUtil.narrow(JtaResourceUtil.java:102)
at JtaResourceUtil.getUserTransaction(JtaResourceUtil.java:66)
at HelloWorldServlet.DAOTest(HelloWorldServlet.java:45)
at HelloWorldServlet.doGet(HelloWorldServlet.java:18)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:731)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.ClassCastException: org.objectweb.jotm.Current
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:212)
... 21 more
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-01-12 14:43
APIリファレンスを見る限りでは、org.objectweb.jotm.CurrentクラスはUserTransaction
を実装しているようなので問題ないように思うのですが、いったい何が問題なのですか?
Yaksa
会議室デビュー日: 2005/01/11
投稿数: 6
投稿日時: 2005-01-12 15:02
インギさん、ukさん返信ありがとうございます。
何が問題なのですかという事ですが
lookupにより返却されるObjectのgetClass()を行った結果はorg.objectweb.jotm.Current
に見えましたが、実際にorg.objectweb.jotm.CurrentへキャストしようとしてもClassCastExceptionが発生してしまうために詰まっています。
本来はUserTransactionFactoryをlookupする事でorg.objectweb.jotm.Currentが返るはず
なのですが、参照のみ返っている気がします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-01-12 15:11
意味がよくわからないのですが、

UserTransaction obj = (UserTransaction)lookup("java:comp/UserTransaction");

では動かない、ということですか? getClassでCurrentであることが確認できているので
あれば、これで動くと思うのですが。
Yaksa
会議室デビュー日: 2005/01/11
投稿数: 6
投稿日時: 2005-01-12 15:17
ukさん度々すみません。

UserTransaction obj = (UserTransaction)lookup("java:comp/UserTransaction");
でもClassCastExceptionが発生しているのです。
それ故に何が悪いのかさっぱりな状況です。

スキルアップ/キャリアアップ(JOB@IT)