4

我想知道在骆驼处理器上获得同步的方法。

我在docs找到的唯一相关的东西:

请注意,在设计上使用 ActiveMQ、JMS 或 SEDA 时没有并发或锁定问题;它们专为高度并发使用而设计。然而,消息的处理器中可能存在并发问题,即处理器对消息做了什么?

因此,如果我想锁定org.apache.camel.Processor.process(Exchange),即我希望其他线程在忙时等待进程方法完成。那可能吗?

更新:实际上我试图在进程方法中进行同步(锁定) - 这在 JVM 端有效。但是我的处理器是事务路由的一部分,这是一个问题 - 对持久层的所有更改只有在退出处理器(甚至可能是路由)后才可见。所以我认为这个问题有一些类似骆驼的解决方案。

4

1 回答 1

3

您在 Camel 处理器中实现的业务逻辑必须是线程安全的,因为多个线程将在 Camel 中路由消息期间重用同一个实例。

如果你想使用原型作用域(例如,为每条消息创建一个新的处理器实例),那么你可以使用 bean 组件,并设置 cache=false,如果你使用 spring,则将 bean 声明为原型

   <bean id="myBean" class="com.foo.MyBean" scope="prototype"/>

然后在路由中调用这个bean

   .to("bean:myBean?cache=false")

尽管人们经常使用单例实例。

如果您想要任何类型的锁定,您可以将方法定义为同步并让 JVM 为您锁定它。

public synchronized void process(Exchange exchange) throws Exception {
  ...
}
于 2013-11-09T08:58:18.840 回答