- - PR -
UserTransactionが返らず困っています
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2005-01-12 01:20
最近の事情は知らないんですが、Tomcat って JTA サポートしてましたっけ?
http://www.theserverside.com/discussions/thread.tss?thread_id=30150 | ||||
|
投稿日時: 2005-01-12 12:22
Tomcat自体はサポートしていません。この場合はJOTMというJTA実装を使っているのだと思います。 とりあえず、JOTMをどのようにセットアップしたのか、Tomcatのログに何か出ていればそれを 書いた方がいいと思います。 | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 2005-01-12 14:43
APIリファレンスを見る限りでは、org.objectweb.jotm.CurrentクラスはUserTransaction
を実装しているようなので問題ないように思うのですが、いったい何が問題なのですか? | ||||
|
投稿日時: 2005-01-12 15:02
インギさん、ukさん返信ありがとうございます。
何が問題なのですかという事ですが lookupにより返却されるObjectのgetClass()を行った結果はorg.objectweb.jotm.Current に見えましたが、実際にorg.objectweb.jotm.CurrentへキャストしようとしてもClassCastExceptionが発生してしまうために詰まっています。 本来はUserTransactionFactoryをlookupする事でorg.objectweb.jotm.Currentが返るはず なのですが、参照のみ返っている気がします。 | ||||
|
投稿日時: 2005-01-12 15:11
意味がよくわからないのですが、
UserTransaction obj = (UserTransaction)lookup("java:comp/UserTransaction"); では動かない、ということですか? getClassでCurrentであることが確認できているので あれば、これで動くと思うのですが。 | ||||
|
投稿日時: 2005-01-12 15:17
ukさん度々すみません。
UserTransaction obj = (UserTransaction)lookup("java:comp/UserTransaction"); でもClassCastExceptionが発生しているのです。 それ故に何が悪いのかさっぱりな状況です。 | ||||
