锁定Camel处理器

时间:2013-11-08 22:35:49

标签: concurrency parallel-processing jms apache-camel

我想知道在Camel Processor上获得同步的方法。

我在docs找到的唯一相关内容:

  

请注意,使用时不存在并发或锁定问题   ActiveMQ,JMS或SEDA设计;它们是专为高度设计的   并发使用。但是,可能存在并发问题   消息的处理器,即处理器对其执行的操作   消息?

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

然后在路径中调用此bean

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

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

如果你想要任何类型的锁定,你可以将方法定义为synchronized,让JVM为你锁定它。

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