joinTransaction一直呼吁在ApacheCamel本地资源的EntityManager [英] joinTransaction has been called on a resource-local EntityManager in ApacheCamel
问题描述
我是新来的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 =http://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
。编辑:
通过下面的设置,我可以让它工作:
不要初始化的
的EntityManagerFactory
和事务管理
自己,只是做:最后SimpleRegistry注册表=新SimpleRegistry();
最后CamelContext语境=新DefaultCamelContext(注册表);
context.addRoutes(新JpaSetupRouteBuilder());
context.start();
在
的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 defaulttransaction-type
which isRESOURCE_LOCAL
instead ofJTA
.EDIT:
With following setup, I could make it work:
Don't init the
EntityManagerFactory
andTransactionManager
yourself, just do:final SimpleRegistry registry = new SimpleRegistry(); final CamelContext context = new DefaultCamelContext(registry); context.addRoutes(new JpaSetupRouteBuilder()); context.start();
In
persistence.xml
rename yourpersistence-unit
tocamel
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
tocamel
then you could set its name in the URI using thepersistenceUnit
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屋!