首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Atomikos,Tomcat,JTA java.lang.ClassCastException

Atomikos,Tomcat,JTA java.lang.ClassCastException
EN

Stack Overflow用户
提问于 2013-06-21 23:19:01
回答 1查看 6.3K关注 0票数 3

试图让事务使用Tomcat、Atomikos、ActiveMQ和MySql工作。遵循这些例子:Tomcat 7与Atomikos 3.5.2的集成Tomcat 7.0.27与Atomikos 3.7.1的集成没有成功.

代码语言:javascript
复制
ERROR: com.atomikos.icatch.jta.UserTransactionManager cannot be cast to javax.transaction.TransactionManager
java.lang.ClassCastException: com.atomikos.icatch.jta.UserTransactionManager cannot be cast to javax.transaction.TransactionManager

使用:

  • 猫7.0.29
  • Atomikos 3.7.1
  • ActiveMQ 5.8.0
  • MySQL 5.5.31

将下面的jars放在$TOMCAT_HOME/lib下面

  • atomikos-integration-extension-3.7.1-20120529.jar
  • atomikos-util-3.7.1.jar
  • transactions-3.7.1.jar
  • transactions-api-3.7.1.jar
  • transactions-jdbc-3.7.1.jar
  • transactions-jms-3.7.1.jar
  • transactions-jta-3.7.1.jar
  • geronimo-jta_1.0.1B_spec-1.0.jar
  • activemq-all-5.8.0.jar
  • mysql-connector-java-5.1.25.jar

以下是transactions.properties的内容

代码语言:javascript
复制
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.automatic_resource_registration=true
com.atomikos.icatch.output_dir=../work/atomikos
com.atomikos.icatch.log_base_dir=../work/atomikos/log
com.atomikos.icatch.enable_logging=true
com.atomikos.icatch.console_log_level=TRACE

context.xml

代码语言:javascript
复制
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Transaction factory="com.atomikos.icatch.jta.UserTransactionFactory" />

    <Resource name="TransactionManager"
          auth="Container"
          type="com.atomikos.icatch.jta.UserTransactionManager"
          factory="org.apache.naming.factory.BeanFactory" />

    <Resource name="UserTransaction"
          auth="Container"
          type="com.atomikos.icatch.jta.UserTransactionImp"
          factory="org.apache.naming.factory.BeanFactory" />                 

    <Resource name="jms/ConnectionFactory"
            auth="Container"
            description="JMS Connection Factory"
            type="com.atomikos.jms.AtomikosConnectionFactoryBean"
            factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory"
            uniqueResourceName="jms/ConnectionFactory"
            xaConnectionFactoryClassName="org.apache.activemq.ActiveMQXAConnectionFactory"
            xaProperties.brokerURL="vm://localhost"
            xaProperties.transportType="1"
            localTransactionMode="true" />

    <Resource name="jms/WsTopic" 
          auth="Container"
          type="org.apache.activemq.command.ActiveMQTopic" 
          factory="org.apache.activemq.jndi.JNDIReferenceFactory"
          physicalName="WS.TOPIC" />

    <Resource name="jms/WsQueue" 
          auth="Container"
          type="org.apache.activemq.command.ActiveMQQueue"
          factory="org.apache.activemq.jndi.JNDIReferenceFactory" 
          physicalName="WS.QUEUE" />


   <!--  MySQL -->
   <Resource name="jdbc/DB"
          auth="Container"
          type="com.atomikos.jdbc.AtomikosDataSourceBean"
          factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory"
          uniqueResourceName="jdbc/DB"
          minPoolSize="5"
          maxPoolSize="10"
          testQuery="SELECT 1 FROM DUAL"             
          xaDataSourceClassName="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
          xaProperties.databaseName="db"
          xaProperties.serverName="localhost"
          xaProperties.port="3306"
          xaProperties.user="user"
          xaProperties.password="password"
          xaProperties.url="jdbc:mysql://localhost:3306/db"
          xaProperties.pinGlobalTxToPhysicalConnection="true"
          xaProperties.autoReconnect="true"
          xaProperties.autoReconnectForConnectionPools="true"
          xaProperties.autoReconnectForPools="true" />
</Context>

相关的java代码:

代码语言:javascript
复制
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
...

Hashtable<String, String> hashTable = new Hashtable<String, String>();
try {
    Context ctx = new InitialContext(hashTable);
    ctx = (Context) jndiContext.lookup("java:comp/env");

    TransactionManager transactionManager = (TransactionManager) ctx.lookup("TransactionManager");
} catch (Exception e) {
    e.printStackTrace();
}

我做错了什么?

编辑:

在从$TOMCAT_HOME/lib中删除activemq-all-5.8.0.jar之后,我能够通过最初的错误,但现在我得到了:

代码语言:javascript
复制
com.atomikos.jms.AtomikosJMSException: Error in proxy
at com.atomikos.jms.AtomikosJMSException.throwAtomikosJMSException(AtomikosJMSException.java:54)
at com.atomikos.jms.ConsumerProducerSupport.handleException(ConsumerProducerSupport.java:61)
at com.atomikos.jms.AtomikosJmsMessageConsumerProxy.receive(AtomikosJmsMessageConsumerProxy.java:73)
at com.atomikos.jms.AtomikosJmsMessageConsumerProxy.receive(AtomikosJmsMessageConsumerProxy.java:137)
...
at java.lang.Thread.run(Thread.java:619)
Caused by: com.atomikos.jms.AtomikosTransactionRequiredJMSException: The JMS session you are using requires a JTA transaction context for the calling thread and none was found.
Please correct your code to do one of the following: 
1. start a JTA transaction if you want your JMS operations to be subject to JTA commit/rollback, or
2. increase the maxPoolSize of the AtomikosConnectionFactoryBean to avoid transaction timeout while waiting for a connection, or
3. create a non-transacted session and do session acknowledgment yourself, or
4. set localTransactionMode to true so connection-level commit/rollback are enabled.
    at com.atomikos.jms.AtomikosTransactionRequiredJMSException.throwAtomikosTransactionRequiredJMSException(AtomikosTransactionRequiredJMSException.java:38)
    at com.atomikos.jms.ConsumerProducerSupport.enlist(ConsumerProducerSupport.java:107)
    at com.atomikos.jms.AtomikosJmsMessageConsumerProxy.receive(AtomikosJmsMessageConsumerProxy.java:70)
    ... 5 more
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-24 18:45:22

Tomcat使用多类装载器。参见它们的定义,它是如何工作的,哪个优先(引导、系统、webapp、公共)。我假设您将geronimo-jta_1.0.1B_spec-1.0.jar和/或transactions-jta-3.7.1.jar放在WAR文件webapp.war/WEB-INF/lib/以及$TOMCAT_HOME/lib/之外。这可能会导致问题,因为不同的类加载器将多次加载javax.transaction.TransactionManager类。即使类具有相同的名称,如果由不同的类加载器加载,转换也会失败。

  1. 当Tomcat初始化由TransactionManager实现的context.xml中定义的容器范围的com.atomikos.icatch.jta.UserTransactionManager资源时,它首先使用公共类加载器($Tomcat_HOME/lib/*..jar)加载。(Tomcat目前不使用任何webapp类加载程序。)
  2. 在web应用程序中使用javax.transaction.TransactionManager类,现在它将从位于WAR文件中的webapp.war/WEB-INF/lib/文件夹中的JAR文件的副本中加载webapp类加载器。

尝试从javax.transaction.TransactionManager类中删除包含webapp.war/WEB-INF/lib/类的JAR文件,并尝试重新部署应用程序。

或者,在CLASSPATH系统变量中列出这些JAR文件,这样这些类将由在Tomcat中具有优先级的系统类加载器加载。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17245643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档