JAVA项目开发笔记(2)JTA 部分:使用JOTM

记录开发过程中使用JTA遇到的各种问题和技巧,不定时更新。

 

转载请注明出处(Cooper的专栏    http://blog.csdn.net/cooper_lyt

  • Log4j与JOTM

使用JOTM建议在你的工程里放一个log4j的配置文件,级别设为DEBUG,这样会得到很多有用的信息。

例如:

本人使用的是JDK6, 在没设置log4j的配置文件时tomcat启动里遇到以下错误 :

警告: Failed to register in JMX: javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ExceptionInInitializerError]
2008-10-6 16:09:01 org.apache.catalina.core.NamingContextListener addResource
警告: Failed to register in JMX: javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.NoClassDefFoundError: Could not initialize class org.objectweb.jndi.DataSourceFactory]
2008-10-6 16:09:02 org.apache.coyote.http11.Http11Protocol start

后来放入了log4j的配置文件显示出了DEBUG信息才发现原来是配置文件中多了的一个空格引起的。

关于log4j的使用方法,网上一搜一大堆,这里就不详细说明了,不过log4j在shark(工作流引擎,有关介绍参见本人的其它文章)使用中会出现问题,既:当工作流引擎启动后,自已项目中的任何级别的日志都输出不了,仅shark引擎的日志可以输出。后来经过研究发现,原来在shark的配置文件中有自已的log4j配置,而且还实现了log4j的日志生成类,以记录shark引擎的日志并按级别分类输出到文件、数据库等不同位置,目前本人正在研究如何将自已项目中的日志与shark日志分开,并输出到不同位置,如有这方面的牛人还请指点一下。如果试验成功本人会在以后的文章中对log4j和shark的集成做详细说明的。

 

 

JOTM2.XX不支持JDK5.0以上的版本 访问里遇到名子没找到 Name not found;Can not create instance.....

 要想在JDK5以上版本使用JOTM需要重新编译jotm 的CAROL库。。。。可能官网下载有源码的版本自己用jdk5以上的版本重新编译。

 

重新编译需要下载ant,到官网下载ant设置好环境变量及JKD的环境变量

  • JDK环境变量设置

使用JDK6的安装程序装完后已经不用设置JDK的环境变量了,以前的版本中安装程序会自动设置环境变量,但是安装完JDK6后我查看环境变量,安装程序并没有自动设置JDK 的环境变量,但是Eclipse仍然可以使用,后来我才发现新的JDK安装后系统里有一个Java的服务,应该是有自动设置环境变量的功能和自动升级的功能。但是我在使用ant编译JOTM的CAROL库时却报找不到javac的错误,后来我设置了JDK的环境变量,问题就解决了,可能的原因有两个(这是我的猜测,没有经过试验仅供参考,欢迎牛人指正)

1:java的服务自动设置的环境指向的可能是JRE而不是JDK。

2:我无意中把java的服务的一些功能给停了,由于不喜欢JDK的自动升级所以我把这个给停了,可能是会有一些影响。

我的设置

JAVA_HOME   C:/Program Files/Java/jdk1.6.0_03

path 里加入 C:/Program Files/Java/jdk1.6.0_03/bin

 

  • ANT环境变量设置

    这个要设置两个环境变量

ANT_HOME        E:/tools/WorkTools/Java/apache-ant-1.7.1

path 里加入 E:/tools/WorkTools/Java/apache-ant-1.7.1/bin

  • 编译JOTM的CAROL库

     这步很简单,在command中转到你下载的JOTM的CAROL库的根目录下,运行ant就可以了 ant会在当前目录查找build.xml文件并开始编译,最后在根目录生成的output文件夹中的lib目录下就会生成新编译好的jar包了。

  • 注意

     如果在使用ANT编译的过程中,如果出现错误,编译失败,可能是由于你的CAROL库的目录的路径太长或有空格等其它的字符,所以更改你的CAROL库的路径可能就会解决问题的。例如我的解压后就改到e:/carol下注意把目录中的版本号及“-”都去掉。

     在编译的过程中会出现JAVAC的警告说:XXXX   是sun 的专用 API,可能会在未来版本中删除,不用理会,因为JOTM开发时使用的JDK版本比较老,使用的很多新版JDK不推荐使用的类才会出现这种警告。

 

  • JOTM配置

      参考了以下两篇文章(这两篇文章被转载的很多已找不到原创了,在此对两位作者表是感谢和同情,希望大家尊重原创,转载时注明出处)

        http://feng10251225.blog.163.com/blog/static/6312279820086134231910/

        http://java.e800.com.cn/articles/2007/417/1176746498587392322_1.html

不过试过之后还是遇到了问题

1. 这两篇文章好像也在互相抄,很多部分是一样的。但是重要的是还都抄错了,配置文件都多了空格,大家引用时要注意(我上面提到过)。

2.两篇文章都说要把数据库的JNDI的数据源配置到<Tomcat安装目录>/conf/context.xml ,我认为不好,自已项目的东东为什么要放到TOMCAT 中去呢!解决办法是放到自已项目的META-INF下的context.xml(没有这个文件可以新建一个)中去。不过好像tomcat的旧版本不可以这么放,我查了一些资料,好像是tomcat的旧版本设置数据源还是很麻烦的,好像要在Tomcat的server.xml中设置,5.5之后才改的方便的,我用的是Tomcat6,有关其它设置数据源的方法 可以参考以下文章。

http://www.webjx.com/htmldata/2005-07-24/1122157105.html

http://www.pconline.com.cn/pcedu/empolder/gj/java/0411/503328.html

有关tomcat管理工具的安装可参考以下文章

http://qzone.qq.com/blog/280879806-1210783215(这人用QQ的blog.....)

我的context.xml:

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <Context path="/JTATest" debug="5" reloadable="true" crossContext="true">
  3.     <Resource name="testA" auth="Container" type="javax.sql.DataSource"
  4.         factory="org.objectweb.jndi.DataSourceFactory" maxWait="5000"
  5.         maxActive="300" maxIdle="2" username="sa" password="null"
  6.         driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
  7.         url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jatTestA;SelectMethod=cursor" />
  8.     <Transaction factory="org.objectweb.jotm.UserTransactionFactory"
  9.         jotm.timeout="180" />
  10. </Context>

2.这里的配置文件好像有问题我用了之后出现如下错误

"javax.naming.NameNotFoundException: Name java:comp is not bound in this Context"

无论我把文章中提到的jotm的配置放到tomcat的lib目录下(tomcat6取消了common/classes目录,所有的资源都放到lib目录下)还是我项目中都出现上面的错误,后来我直接把这个配置删除,这个问题就消失了,正常的rollback程commit都没问题,我看了一下jotm的包,如果用户没有设置carol.properties的话jotm会使用ow_carol.jar中的carol-defaults.properties作为却省配置。这样看来也就是说文章中提到的配置文件是有问题的。或者是我有什么地方没有设置好,还请牛人指点了。另外在网上查找这个错误的时候找到了这篇文章:http://hi.baidu.com/ycsx/blog/item/212da4ef2317cd10fdfa3c9a.html 报的错同我的一样但是原因不同,同学们可以参考一下。

其它部分的设置大部分参考以上两篇文章中的做法基本可以完成JOTM的配置,有关JOMT、Shark、Spring和hibernate之间融合的问题我会在以后的文章中说明的。

 

经本人研究发现 Shark1.1 根本不支持 JOMT 但是shark 2.XX是支持的。

现在有两套方案

1.改用2.XX版本的shark

2.使用Shark1.1版中提供的SharkTransaction来实现shark库的事物,用jomt来实现其它两个库的事物,在jomt要提交或回滚时代码调用SharkTransaction一并提交和回滚,反之依然,然而这个想法是很笨的,因为如果外层的事务出错,而内层的事务已经提交就会出现问题,根本没有达到分布事务的要求,所以最后还是选择了第一种方案。

要选那种还在研究中。

 

现在已经选用了shark2了..时间证明这是正确的选择,由于spring对jotm的支持,所以现在的项目中没有一句用于事务控制的java代码,都由spring的配置文件来设置,但是后来也出现的问题,参见我的文章,shark数库据死锁.

转载请注明出处(Cooper的专栏    http://blog.csdn.net/cooper_lyt

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值