簡體   English   中英

駱駝+ JBoss + JPA:TransactionRequiredException:盡管有JTA數據源,但無法注冊JTA事務

[英]Camel + JBoss + JPA: TransactionRequiredException: Unable to register for JTA transaction despite JTA data source

我有一個基於Apache Camel的應用程序,該應用程序在JBoss AS 7.1應用程序服務器上運行。

在一種Camel路由中,我讓Camel讀取XML文件,使用JAXB將其解組到JPA實體對象,然后使用Camel jpa://組件將其寫入數據庫。

但是,無論何時將實體發送到JPA端點,Camel都會為我提供以下TransactionRequiredException:

javax.persistence.TransactionRequiredException: joinTransaction has been called on a resource-local EntityManager which is unable to register for a JTA transaction.
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.registerIfRequired(EntityTransactionWrapper.java:91)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.joinTransaction(EntityManagerImpl.java:2092)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.doJoinTransaction(ExtendedEntityManagerCreator.java:360)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:327)
    at com.sun.proxy.$Proxy48.joinTransaction(Unknown Source)
    at org.apache.camel.component.jpa.JpaProducer$1.doInTransaction(JpaProducer.java:64)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131)
    at org.apache.camel.component.jpa.JpaProducer.process(JpaProducer.java:61)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:152)
    at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:304)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:147)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:424)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:51)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:120)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:424)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:105)
    at org.apache.camel.processor.MulticastProcessor.doProcessParallel(MulticastProcessor.java:735)
    at org.apache.camel.processor.MulticastProcessor.access$200(MulticastProcessor.java:82)
    at org.apache.camel.processor.MulticastProcessor$1.call(MulticastProcessor.java:303)
    at org.apache.camel.processor.MulticastProcessor$1.call(MulticastProcessor.java:288)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

我不明白的是,JPA堅持認為我的EntityManager是本地資源。 在我的persistence.xml中,我已將數據源定義為JTA:

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="foobar">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:jboss/datasources/myDS</jta-data-source>
    <mapping-file>META-INF/eclipselink-orm.xml</mapping-file>
    <!-- ... lots of entity classes omitted ... -->
    <properties>
      <property name="eclipselink.weaving" value="static"/>
      <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
      <property name="eclipselink.ddl-generation.output-mode" value="database"/>
      <property name="eclipselink.logging.parameters" value="true"/>
    </properties>
  </persistence-unit>
</persistence>

我的applicationContext.xml中的相關部分是這樣的:

<!-- snip -->

        <import resource="classpath:/datasource.xml"/>

        <tx:annotation-driven />

        <bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent">
            <property name="entityManagerFactory" ref="entityManagerFactory"/>
            <property name="transactionManager" ref="transactionManager"/>
        </bean>

        <camelContext xmlns="http://camel.apache.org/schema/spring" id="foobar-context" useMDCLogging="true">

            <!-- ... most routes omitted ... --> 

            <camel:route id="readXML">
                <camel:from uri="file://C:/Data/xmldir"/>               
                <camel:to uri="direct:persistProduct"/>
            </camel:route>

            <camel:route id="persistProduct">
                <camel:from uri="direct:persistProduct"/>
                <camel:unmarshal ref="tnxJAXB"/>
                <camel:to uri="jpa:com.foo.bar.Product"/>
            </camel:route>

            <!-- ... a lot of other unrelated stuff omitted ... -->

        </camelContext>

<!-- snip --> 

為了可測試性,數據源素材位於另一個文件中:

datasource.xml(完整):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    ">

    <jee:jndi-lookup id="myDS" jndi-name="java:jboss/datasources/myDS" />

    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="foobar"/>
    </bean>

    <context:annotation-config/>
    <tx:annotation-driven transaction-manager="transactionManager" />

</beans>

如果我在網上進行的研究透徹,那么所有這些都應該是正確的,並且事務管理應該起作用。 但是,事實並非如此。 我究竟做錯了什么?

我正在使用的軟件包版本:

  • 駱駝2.14.3
  • 春天4.1.6.RELEASE
  • Eclipselink 2.6.0-M3
  • JBoss AS 7.1.1-最終版

在此先感謝大家!

當您不啟動事務時,通常會發生此異常。 請記住,事務需要在服務級別而不是存儲庫級別啟動。 由於服務和存儲庫代碼不可用,因此無法提供更多幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM