【问题标题】:Getting lock on Camel Processor锁定骆驼处理器
【发布时间】:2013-11-21 02:16:29
【问题描述】:

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

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

请注意,使用时没有并发或锁定问题 ActiveMQ、JMS 或 SEDA 设计;它们是专为高度 并发使用。但是可能存在并发问题 消息的处理器,即处理器对 留言?

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

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

【问题讨论】:

  • 不好意思说白了,你就不能试试看吗?
  • 请看我的更新。很抱歉很无聊。

标签: concurrency parallel-processing jms apache-camel


【解决方案1】:

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

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

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

然后在路由中调用这个bean

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

虽然人们经常使用单例实例。

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

public synchronized void process(Exchange exchange) throws Exception {
  ...
}

【讨论】:

  • 感谢克劳斯,使用 prototype 的技巧会忽略多线程处理的能力。 process 方法上的 synchronized 对我有帮助,但我再次失去了使用多个线程调用处理器的能力。请看我的更新,我没有显示所有图片。也许有一些更复杂的解决方案?
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
相关资源
最近更新 更多