joinTransaction была вызвана на локальном ресурсе EntityManager в ApacheCamel
-
24-12-2019 - |
Вопрос
Я новичок в apache camel и тестирую camel-jpa для опроса из таблицы и отображения записей
Ниже приведен основной класс
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 Project, а затем устанавливаю фасет 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)
Решение
Из журнала
ресурс -локальный EntityManager, который не может зарегистрироваться для транзакции JTA
Я прихожу к выводу, что маршрут camel развернут в среде транзакций JTA, но что в вашем persistence.xml
вы можете использовать значение по умолчанию transaction-type
который является RESOURCE_LOCAL
вместо того, чтобы JTA
.
Редактировать:
Со следующей настройкой я мог бы заставить это работать:
Не запускайте
EntityManagerFactory
иTransactionManager
сам, просто делай:final SimpleRegistry registry = new SimpleRegistry(); final CamelContext context = new DefaultCamelContext(registry); context.addRoutes(new JpaSetupRouteBuilder()); context.start();
В
persistence.xml
переименуйте свойpersistence-unit
Дляcamel
такие , как:<!-- setting the transaction-type to RESOURCE_LOCAL is optional as this is the default --> <persistence-unit name="camel" transaction-type="RESOURCE_LOCAL">
Да, я знаю, это не очень приятно.
Редактировать:
Если вы не хотите или не в состоянии переименовать persistence-unit
Для camel
затем вы могли бы задать его имя в 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, как описано здесь.