带有 JPA 组件、循环和窃听的 Apache Camel 抛出 entitymanger cloesd 异常

Apache Camel with JPA-Component, loop and wiretap throws entitymanger cloesd exception

我有一个关于窃听器和 jpa-camel 组件的问题。 我有一条通过窃听进行异步拆分的路由。 在每个路由中,我使用一个 jpa 生产者来持久化一个实体。 问题是,实体管理器在异步路由到达终点之前就关闭了。 原因是,在异步路由中使用了相同的实体管理器。主路由走到尽头,关闭entitymanager。

例如像下面的路线:

<route id="mainRoute>
    <from uri="direct:restendpoint"/>
    ...
    <to uri="jpa:MyEntity"/>
    ...
    <loop copy="true">
        ...
        <wireTap uri="direct:asyncroute"/>
    </loop>
</route>

<route id="asyncRoute">
    <from uri="direct:asyncroute"/>
    ...
    <to uri="jpa:MyEntity"/>
    ...
</route>

我认为可能的修复方法是检查 entitymanager 是否为空或已关闭。如果为空或关闭,则创建一个新的实体管理器。

public final class JpaHelper {
    ...
    public static EntityManager getTargetEntityManager(Exchange exchange, ...
        ...
        if (em == null || !em.isOpen()) {
            // create a new entity manager
            em = entityManagerFactory.createEntityManager();
        ...
        }
    }
    ...
}

另一种解决方法是窃听。在复制交换的地方,可以删除 "CamelEntityManager" 属性。

我的快速修复:在异步路由的开始,我从交换中删除了 entitymanager。

我使用 Camel 2.15.2 和 Spring-Boot 1.2。3.RELEASE

有人知道更好的解决方案吗?

此问题已在 Camel v. 2.16 中修复。 参见 documentation