joinTransaction一直呼吁在ApacheCamel本地资源的EntityManager [英] joinTransaction has been called on a resource-local EntityManager in ApacheCamel

查看:223
本文介绍了joinTransaction一直呼吁在ApacheCamel本地资源的EntityManager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新来的Apache的骆驼和我测试的骆驼JPA从表显示记录轮询

以下是主类

 的EntityManagerFactory的entityManagerFactory = Persistence.createEntityManagerFactory(LoanServicePU);
CamelContext camelContext =新DefaultCamelContext();JpaComponent JPA =新JpaComponent();
jpa.setEntityManagerFactory(entityManagerFactory的);
JpaTransactionManager myTM =新JpaTransactionManager();
myTM.setEntityManagerFactory(entityManagerFactory的);
jpa.setTransactionManager(myTM);
jpa.setCamelContext(camelContext);
camelContext.addRoutes(新JpaRouteBuilder());
camelContext.addComponent(JPA,JPA);
camelContext.start();
视频下载(10000);
camelContext.stop();
的System.out.println(完成);

以下是jparouter类

 公共无效配置()抛出异常{
          从(JPA://com.pns.ab.model.LoanRequest consumeDelete = FALSE;
                +consumer.delay = 2000; maxMessagesPerPoll = 1000;
                +consumer.namedQuery = selectLoanRequests)至(流:走出);
}

我配置的persistence.xml及其下的META-INF,其实在我的Eclipse启动Java项目,然后设置JPA面

的persistence.xml

 <持久性版本=2.1的xmlns =htt​​p://xmlns.jcp.org/xml/ns/persistence的xmlns:XSI =HTTP:// WWW。 w3.org/2001/XMLSchema-instanceXSI:的schemaLocation =http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd >
    <持久性单位名称=LoanServicePU交易型=RESOURCE_LOCAL>
    <提供商GT; org.eclipse.persistence.jpa.PersistenceProvider< /提供商GT;
    <类别和GT; com.pns.ab.model.LoanRequest< /班>
       <性状>
       <属性名=eclipselink.target服务器VALUE =无/>
       <属性名=javax.persistence.jdbc.driverVALUE =oracle.jdbc.OracleDriver/>
       <属性名=javax.persistence.jdbc.url值=的jdbc:神谕:薄:@ 127.0.0.1:1521:XE/>
       <属性名=javax.persistence.jdbc.userVALUE =与/>
       <属性名=javax.persistence.jdbc.passwordVALUE =与/>
       <属性名=eclipselink.logging.levelVALUE =INFO/>
      < /性状>
  < /持久化部>
< /持久>

但是我收到以下错误:

  [主]信息org.apache.camel.impl.DefaultCamelContext  -  Apache的骆驼2.12.3(CamelContext:骆驼-1)1.426秒开始
[骆驼(骆驼-1)线#0 - JPA://com.pns.ab.model.LoanRequest] WARN org.apache.camel.component.jpa.JpaConsumer - 消费者Consumer[jpa://com.pns.ab.model.LoanRequest?consumeDelete=false%3Bconsumer.delay%3D2000&consumer.namedQuery=selectLoanRequests]失败轮询端点: Endpoint[jpa://com.pns.ab.model.LoanRequest?consumeDelete=false%3Bconsumer.delay%3D2000&consumer.namedQuery=selectLoanRequests].将在接下来的调查再试一次。产生的原因:javax.persistence.TransactionRequiredException - joinTransaction已呼吁其无法为一个JTA事务注册一个本地资源EntityManager的。]
javax.persistence.TransactionRequiredException:joinTransaction已呼吁其无法为一个JTA事务注册一个本地资源EntityManager的。
在org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.registerIfRequired(EntityTransactionWrapper.java:91)
在org.eclipse.persistence.internal.jpa.EntityManagerImpl.joinTransaction(EntityManagerImpl.java:2081)


解决方案

从日志


  

本地资源EntityManager的是无法为一个JTA事务注册


我的结论是骆驼的路线被部署到一个JTA事务的环境,但在你的的persistence.xml 你可以使用默认的交易类型 RESOURCE_LOCAL 而不是 JTA

编辑:

通过下面的设置,我可以让它工作:


  1. 不要初始化的的EntityManagerFactory 事务管理自己,只是做:

     最后SimpleRegistry注册表=新SimpleRegistry();
    最后CamelContext语境=新DefaultCamelContext(注册表);
    context.addRoutes(新JpaSetupRouteBuilder());
    context.start();


  2. 的persistence.xml 你的持久性单元命名骆驼如:

     <! - 设置事务类型来RESOURCE_LOCAL是可选的,因为这是默认的 - >
    <持久性单位名称=骆驼的交易类型=RESOURCE_LOCAL>


是的,我知道,这是不是很让人满意。

编辑:

如果你不想或者不能在持久性单元命名骆驼那么你使用 persistenceUnit 选项,如在URI可以设置它的名称:

 从(JPA://com.pns.ab.model.LoanRequest consumeDelete =假
         +&放大器; consumer.delay = 2000; maxMessagesPerPoll = 1000
         +与& consumer.namedQuery = selectLoanRequests
         +与& persistenceUnit = LoanServicePU)
    。要(流:走出);

编辑:

或者,使用Spring XML设置的描述这里

I am new to apache camel and I am testing camel-jpa to poll from table and display records

Following is main class

EntityManagerFactory    entityManagerFactory =  Persistence.createEntityManagerFactory("LoanServicePU");        
CamelContext camelContext = new DefaultCamelContext();

JpaComponent jpa = new JpaComponent();
jpa.setEntityManagerFactory(entityManagerFactory);
JpaTransactionManager myTM=new  JpaTransactionManager();
myTM.setEntityManagerFactory(entityManagerFactory);
jpa.setTransactionManager( myTM );
jpa.setCamelContext(camelContext);
camelContext.addRoutes(new JpaRouteBuilder());
camelContext.addComponent("jpa",jpa);
camelContext.start();
Thread.sleep(10000);
camelContext.stop();
System.out.println("Done");

Following is jparouter class

public void configure() throws Exception {
          from("jpa://com.pns.ab.model.LoanRequest?consumeDelete=false;"
                + "consumer.delay=2000;maxMessagesPerPoll=1000;"
                + "consumer.namedQuery=selectLoanRequests").to("stream:out");
}

I configured persistence.xml and its under META-INF, in fact in eclipse I start Java Project and then set JPA facet

persistence.xml

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="LoanServicePU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>com.pns.ab.model.LoanRequest</class>
       <properties>
       <property name="eclipselink.target-server" value="None"/>
       <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
       <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
       <property name="javax.persistence.jdbc.user" value="vs"/>
       <property name="javax.persistence.jdbc.password" value="vs"/>
       <property name="eclipselink.logging.level" value="INFO"/>
      </properties>
  </persistence-unit>
</persistence>

But I am getting following error:

[main] INFO org.apache.camel.impl.DefaultCamelContext - Apache Camel 2.12.3 (CamelContext: camel-1) started in 1.426 seconds
[Camel (camel-1) thread #0 - jpa://com.pns.ab.model.LoanRequest] WARN org.apache.camel.component.jpa.JpaConsumer - Consumer Consumer[jpa://com.pns.ab.model.LoanRequest?consumeDelete=false%3Bconsumer.delay%3D2000&consumer.namedQuery=selectLoanRequests] failed polling endpoint: Endpoint[jpa://com.pns.ab.model.LoanRequest?consumeDelete=false%3Bconsumer.delay%3D2000&consumer.namedQuery=selectLoanRequests]. Will try again at next poll. Caused by: [javax.persistence.TransactionRequiredException - joinTransaction has been called on a resource-local EntityManager which is unable to register for a JTA transaction.]
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:2081)

解决方案

From the log

resource-local EntityManager which is unable to register for a JTA transaction

I conclude that the camel route is deployed to a JTA transaction environment but that in your persistence.xml you may use the default transaction-type which is RESOURCE_LOCAL instead of JTA.

EDIT:

With following setup, I could make it work:

  1. Don't init the EntityManagerFactory and TransactionManager yourself, just do:

    final SimpleRegistry registry = new SimpleRegistry();
    final CamelContext context = new DefaultCamelContext(registry);
    context.addRoutes(new JpaSetupRouteBuilder());
    context.start();
    

  2. In persistence.xml rename your persistence-unit to camel such as:

    <!-- setting the transaction-type to RESOURCE_LOCAL is optional as this is the default -->
    <persistence-unit name="camel" transaction-type="RESOURCE_LOCAL"> 
    

Yes, I know, this is not very satisfying.

EDIT:

If you don't want to or are not able to rename the persistence-unit to camel then you could set its name in the URI using the persistenceUnit option such as:

from("jpa://com.pns.ab.model.LoanRequest?consumeDelete=false"
         + "&consumer.delay=2000;maxMessagesPerPoll=1000"
         + "&consumer.namedQuery=selectLoanRequests"
         + "&persistenceUnit=LoanServicePU")
    .to("stream:out");

EDIT:

Or alternatively, use the Spring XML setup as described here.

这篇关于joinTransaction一直呼吁在ApacheCamel本地资源的EntityManager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆