获取Camel处理器锁定

4
我想了解在Camel处理器上实现同步的方法。
唯一找到的相关信息在文档中:
请注意,使用ActiveMQ、JMS或SEDA时,并没有并发或锁定问题;它们旨在用于高度并发的应用程序。然而,处理器可能存在并发问题,即处理器对消息的处理过程会出现问题。
如果我想在org.apache.camel.Processor.process(Exchange)上获取锁,例如,当该方法繁忙时,我希望其他线程等待process方法完成。这是否可能?
更新:实际上,我尝试在process方法内部使用同步(锁)-这在JVM端有效。但是我的处理器是事务路由的一部分,这是一个问题-只有在退出处理器(甚至可能是路由)后,所有对持久层的更改才会变得可见。因此,我认为这个问题还有一些类似于Camel的解决方案。

抱歉直言,你不能尝试一下吗? - MikeThomas
请看我的更新。抱歉有点无聊。 - Michael Z
1个回答

3

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

如果您想使用原型作用域(例如为每个消息创建处理器的新实例),则可以使用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 {
  ...
}

谢谢Claus,使用 prototype 的技巧会忽略多线程处理的能力。而在 process 方法上使用 synchronized 对我有所帮助,但我又失去了使用多个线程调用Processor的能力。请看我的更新,我没有展示所有的图片。也许还有一些更复杂的解决方案? - Michael Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接