atomikos 在Windows Tomcat下使用遇到的坑

本文介绍了在Windows环境下使用Atomikos与Tomcat时遇到的日志冲突和初始化错误问题。当从Eclipse用Maven插件启动Tomcat时无误,但直接启动Tomcat服务器则报错。问题主要由于多个项目日志目录相同导致。解决方案包括配置transactions.properties和jta.properties文件,避免在同一目录下,并注意文件中配置项的逗号。正确配置后,日志文件将存储在指定目录而非Tomcat bin目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


该问题主要出现在 Windows 环境下. Linux下不会
问题是很这样的:
1. 当在Eclipse 使用 maven的Tomcat 插件启动的时候,是不会报错的;
2. 当将war包放到 tomcat 容器中,启动Tomcat server的时候,就会报错.

eclipse中使用的Tomcat插件如下:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <additionalClasspathDirs>
                        <additionalClasspathDir>D:/config</additionalClasspathDir>
                    </additionalClasspathDirs>                  
                    <uriEncoding>utf-8</uriEncoding>
                    <path>/gwhz</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

ISSUE 1: Log already in use?

一开始,问题的描述如下

ERROR: the specified log seems to be in use already. Make sure that no other instance is running, or kill any pending process if needed.
java.lang.RuntimeException: Log already in use?
at com.atomikos.icatch.standalone.UserTransactionServiceImp.createDefault(UserTransactionServiceImp.java:246)
at com.atomikos.icatch.standalone.UserTransactionServiceImp.init(UserTransactionServiceImp.java:306)
at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:413)
at com.atomikos.icatch.jta.UserTransactionManager.checkSetup(UserTransactionManager.java:90)
at com.atomikos.icatch.jta.UserTransactionManager.init(UserTransactionManager.java:140)

从log中可以知道,应该是日志的目录在同一个了

com.atomikos.icatch.log_base_name
com.atomikos.icatch.log_base_dir

从Eclipse启动,会发现不同的项目,启动的时候,他们的这个是不一样的:

E:\workspace\trunk\gwlogin\gwlogin-web\.\tmlog.lck
E:\workspace\trunk\gwhyz\gwhyz-web\.\tmlog.lck

然后我们再可以发现如果我们啥都没有配置的话,atomikos的配置是这样的:

 com.atomikos.icatch.automatic_resource_registration=true,
 com.atomikos.icatch.client_demarcation=false,
 com.atomikos.icatch.threaded_2pc=false,
 com.atomikos.icatch.serial_jta_transactions=true,
 com.atomikos.icatch.serializable_logging=true,
 com.atomikos.icatch.log_base_dir=.\,
 com.atomikos.icatch.max_actives=50,
 com.atomikos.icatch.checkpoint_interval=500,
 com.atomikos.icatch.enable_logging=true,
 com.atomikos.icatch.output_dir=.\,
 com.atomikos.icatch.log_base_name=tmlog,
 com.atomikos.icatch.max_timeout=300000,
 com.atomikos.icatch.tm_unique_name=192.168.158.80.tm,
 java.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory,
 java.naming.provider.url=rmi://localhost:1099,
 com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory,
 com.atomikos.icatch.force_shutdown_on_vm_exit=false,
 com.atomikos.icatch.default_jta_timeout=10000

从上面可以看到 com.atomikos.icatch.log_base_dir 和 com.atomikos.icatch.output_dir 都是当前目录的

com.atomikos.icatch.log_base_dir=.\
com.atomikos.icatch.output_dir=.\

所以多个项目同时在Tomcat启动的时候,就会报以上的问题. 而且我们可以在Tomcat的bin目录下看到如下的文件:

{your IP}.tm0.epoch
tmlog.lck
tmlog0.log

然后发现这个问题之后,就试着去修改配置文件. 可是配置文件需要放在那儿呢?
通过log中的类

com.atomikos.icatch.standalone.UserTransactionServiceImp.createDefault

我们可以发现,atomikos的配置 最终是从两个文件中读取过来的

1. transactions.properties
2. jta.properties

顺序是,先尝试读取 transactions.properties文件,如果没有读取到,就去读取jta.properties.
如果都没有读取到,那么就使用默认的配置.


ISSUE2: Error in init of UserTransactionServiceImp

然后兴致冲冲的在classpath中,将debug获取到的 默认配置放上去,然后再重启tomcat. 配置如下

 com.atomikos.icatch.automatic_resource_registration=true,
 com.atomikos.icatch.client_demarcation=false,
 com.atomikos.icatch.threaded_2pc=false,
 com.atomikos.icatch.serial_jta_transactions=true,
 com.atomikos.icatch.serializable_logging=true,
 com.atomikos.icatch.log_base_dir=D:\logs\atomikos\gwhyz\,
 com.atomikos.icatch.max_actives=50,
 com.atomikos.icatch.checkpoint_interval=500,
 com.atomikos.icatch.enable_logging=true,
 com.atomikos.icatch.output_dir=D:\logs\atomikos\gwhyz\,
 com.atomikos.icatch.log_base_name=tmlog,
 com.atomikos.icatch.max_timeout=300000,
 com.atomikos.icatch.tm_unique_name=192.168.158.80.tm,
 java.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory,
 java.naming.provider.url=rmi://localhost:1099,
 com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory,
 com.atomikos.icatch.force_shutdown_on_vm_exit=false,
 com.atomikos.icatch.default_jta_timeout=10000

然后重启,发现还是有错误,不过跟之前那个不一样了:

四月 17, 2017 4:51:33 下午 org.apache.catalina.core.StandardContext loadOnStartup
严重: Servlet [dispatcher] in web application [/gwhyz] threw load() exception
com.atomikos.icatch.SysException: Error in init of UserTransactionServiceImp: com.atomikos.icatch.standalone.UserTransactionServiceFactory,
    at com.atomikos.icatch.config.UserTransactionServiceImp.checkInit(UserTransactionServiceImp.java:350)
    at com.atomikos.icatch.config.UserTransactionServiceImp.createTSInitInfo(UserTransactionServiceImp.java:362)
    at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:568)
    at com.atomikos.icatch.jta.UserTransactionManager.startupTransactionService(UserTransactionManager.java:89)
    at com.atomikos.icatch.jta.UserTransactionManager.checkSetup(UserTransactionManager.java:77)
    at com.atomikos.icatch.jta.UserTransactionManager.init(UserTransactionManager.java:142)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
....

从源码中可以发现,是加载的时候报错了:

    private void checkInit ()
    {

        if ( delegate_ != null ) return;

        String factoryClassName = getOrFindProperty ( "com.atomikos.icatch.service" );

        if ( factoryClassName == null )
            throw new SysException (
            "UserTransactionServiceImp: property not defined: com.atomikos.icatch.service" );

        try {
            Class factoryClass = ClassLoadingHelper.loadClass ( factoryClassName );
            UserTransactionServiceFactory factory =
                    ( UserTransactionServiceFactory ) factoryClass.newInstance ();
            delegate_ = factory.getUserTransactionService ( properties_ );
            //This should initialize the properties with whatever is specified and
            //use SYSTEM_DEPENDENT DEFAULT values for others
        }
        catch ( Exception e ) {
            Stack<Exception> errors = new Stack<Exception> ();
            errors.push ( e );
            throw new SysException ( "Error in init of UserTransactionServiceImp: " + e.getMessage() , errors );
        }

    }

这个找啊找啊。一开始以为是lib没加载进去,然后就讲 对应的jar包放到 classpath中,可是还是这样

最后实在没辙了,就从 官网上将jta.properties 放进来,不用 transactions.properties了.
下载的地址为:
https://www.atomikos.com/pub/Documentation/Tomcat7Integration35/jta.properties

然后竟然可以了.
然后再去对比了下 transactions.properties文件,发现自己竟然每一行多了一个逗号.真的快吐血了; 将逗号去掉就可以了


最后的配置如下:

transactions.properties

com.atomikos.icatch.automatic_resource_registration=true
com.atomikos.icatch.client_demarcation=false
com.atomikos.icatch.threaded_2pc=false
com.atomikos.icatch.serial_jta_transactions=true
com.atomikos.icatch.serializable_logging=true
com.atomikos.icatch.log_base_dir=D:\\logs\\atomikos\\gwhyz\\
com.atomikos.icatch.max_actives=50
com.atomikos.icatch.checkpoint_interval=500
com.atomikos.icatch.enable_logging=true
com.atomikos.icatch.output_dir=D:\\logs\\atomikos\\gwhyz\\
com.atomikos.icatch.log_base_name=tmlog
com.atomikos.icatch.max_timeout=300000
com.atomikos.icatch.tm_unique_name=192.168.158.80.tm
java.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory
java.naming.provider.url=rmi://localhost:1099
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.force_shutdown_on_vm_exit=false
com.atomikos.icatch.default_jta_timeout=10000

将 log_base_dir 和 output_dir 的地址指向别的地方,Tomcat下的bin目录中就不会有以下三个文件了,他们会被放到 配置文件中指定的目录中去的

{your IP}.tm0.epoch
tmlog.lck
tmlog0.log
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值