2014-02-27 41 views
0

我是新來的Apache駱駝和我測試的駱駝JPA從表及顯示記錄joinTransaction一直呼籲本地資源的EntityManager在ApacheCamel

以下輪詢是主類

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"); 

以下是jparouter類

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"); 
} 

我配置的persistence.xml和其下的META-INF,其實在Eclipse我開始Java項目,然後設置JPA方面

的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> 

但我得到以下錯誤:

[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) 

回答

0

從日誌

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

我的結論是駱駝航線部署到JTA事務環境,但在你的persistence.xml你可以使用默認的transaction-type這是RESOURCE_LOCAL而不是JTA

編輯:

有了下面的設置,我可以讓它工作:

  1. 不要初始化的EntityManagerFactoryTransactionManager自己,只是做:

    final SimpleRegistry registry = new SimpleRegistry(); 
    final CamelContext context = new DefaultCamelContext(registry); 
    context.addRoutes(new JpaSetupRouteBuilder()); 
    context.start(); 
    
  2. persistence.xml重命名persistence-unitcamel如:

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

是的,我知道,這是不是很令人滿意。

編輯:

如果你不想或者不能重命名persistence-unitcamel,那麼你可以在URI使用persistenceUnit選項,如設置它的名字:

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

編輯:

或者,使用Spring XML設置爲描述here

+0

是我使用RESOURCE_LOCAL由於其獨立的應用程序,而不是部署在服務器上。我如何爲JTA配置JDBC屬性。 JTA詢問有關數據源 – ImranRazaKhan

+0

你可以添加你的'persistence.xml'你的問題? –

+0

感謝它的工作 – ImranRazaKhan