带有 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
我有一个关于窃听器和 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