使用Camel Route

时间:2018-02-21 17:22:59

标签: java hibernate apache-camel apache-karaf

我使用Karaf 4.0.9和JPA / Hibernate 4.3.6和Camel 2.18.5。 我有一个类似

的服务类
@Transactional
public MyEntity update(MyEntity aentity) {
        MyEntity entity = this.entityManager.merge(aentity);
        return entity;
 }

persistence.xml中的数据源是启用JTA的

<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=mydb)</jta-data-source>

MyEntity使用JPA @Version强制执行OptimisticLocking。

@Version
@Column(name = "VERSION")
private Long version;

一切正常,例如我们有一个REST端点,它注入了服务类,实体得到了更新。

我们在蓝图中也有一个Camel路由,它以与REST端点相同的方式使用该服务:

<camelContext id="managerCtx" xmlns="http://camel.apache.org/schema/blueprint">
        <route id="purge">
            <from uri="timer://purgeMaterial?fixedRate=true&amp;period=2h&amp;delay=5000" />
            <transacted />
            <bean ref="myBean" method="purge" />
        </route>
</camelContext>

myBean注入服务类并调用update方法。 但是在这里,当驼峰路线开始时,我得到以下异常:

2018-02-21 15:38:09,807 |警告| :// purgeMaterial |交易| 131 - org.apache.aries.transaction.manager - 1.3.1 |来自beforeCompletion的意外异常;交易将回滚 javax.persistence.OptimisticLockException:行已被另一个事务更新或删除(或未保存的值映射不正确):[MyEntity#11093]     在org.hibernate.jpa.spi.AbstractEntityManagerImpl.wrapStaleStateException(AbstractEntityManagerImpl.java:1785)[238:org.hibernate.entitymanager:4.3.6.Final]     在org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1705)[238:org.hibernate.entitymanager:4.3.6.Final]     在org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)[238:org.hibernate.entitymanager:4.3.6.Final]     在org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)[238:org.hibernate.entitymanager:4.3.6.Final]     在org.hibernate.jpa.spi.AbstractEntityManagerImpl $ CallbackExceptionMapperImpl.mapManagedFlushFailure(AbstractEntityManagerImpl.java:1882)[238:org.hibernate.entitymanager:4.3.6.Final]     在org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:115)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:50)[237:org.hibernate.core:4.3.6.Final]     在org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:527)[131:org.apache.aries.transaction.manager:1.3.1]     在org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:511)[131:org.apache.aries.transaction.manager:1.3.1]     在org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:413)[131:org.apache.aries.transaction.manager:1.3.1]     在org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:262)[131:org.apache.aries.transaction.manager:1.3.1]     at org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:252)[131:org.apache.aries.transaction.manager:1.3.1]     在org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1023)[217:org.apache.servicemix.bundles.spring-tx:4.3.5.RELEASE_1]     在org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)[217:org.apache.servicemix.bundles.spring-tx:4.3.5.RELEASE_1]     在org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)[217:org.apache.servicemix.bundles.spring-tx:4.3.5.RELEASE_1]     在org.apache.aries.transaction.internal.AriesPlatformTransactionManager.commit(AriesPlatformTransactionManager.java:75)[131:org.apache.aries.transaction.manager:1.3.1]     在org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:150)[217:org.apache.servicemix.bundles.spring-tx:4.3.5.RELEASE_1]     在org.apache.camel.spring.spi.TransactionErrorHandler.doInTransactionTemplate(TransactionErrorHandler.java:176)[137:org.apache.camel.camel-spring:2.18.5]     at org.apache.camel.spring.spi.TransactionErrorHandler.processInTransaction(TransactionErrorHandler.java:136)[137:org.apache.camel.camel-spring:2.18.5]     在org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:105)[137:org.apache.camel.camel-spring:2.18.5]     在org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:114)[137:org.apache.camel.camel-spring:2.18.5]     在org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)[135:org.apache.camel.camel-core:2.18.5]     在org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)[135:org.apache.camel.camel-core:2.18.5]     在org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:197)[135:org.apache.camel.camel-core:2.18.5]     在org.apache.camel.component.timer.TimerConsumer $ 1.run(TimerConsumer.java:79)[135:org.apache.camel.camel-core:2.18.5]     在java.util.TimerThread.mainLoop(Timer.java:555)[:1.8.0_141]     在java.util.TimerThread.run(Timer.java:505)[:1.8.0_141] 引起:org.hibernate.StaleObjectStateException:行被另一个事务更新或删除(或未保存的值映射不正确):[MyEntity#11093]     在org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:2541)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3285)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3183)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3525)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:159)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)[237:org.hibernate.core:4.3.6.Final]     在org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:110)[237:org.hibernate.core:4.3.6.Final]     ......还有21个

如果删除实体的@Version注释,一切正常。这应该与路线中的交易声明有关。 任何想法????

1 个答案:

答案 0 :(得分:0)

更新:我发现了问题,我刚刚删除了驼峰路线中的交易元素。之前,我使用过camel 2.17.x,并且需要事务处理元素才能获得交易