锁定聚合器中的相关ID

时间:2014-06-09 16:11:58

标签: spring-integration

查看AbstractCorrelatingMessageHandler的代码,似乎是基于聚合器的相关ID获得锁,以强制处理由单个线程属于相同相关ID的消息组。这是有道理的,事实上我想确保一旦消息从聚合器中释放,只要它们被发布的同一个线程中的任何下游组件处理,聚合器就不应该释放属于的聚合器。相同的相关ID(如果他们进来)。

所以,例如如果我发送消息" A"相关ID为" 1"并立即发送消息" B"属于相同的相关id并让聚合器释放两者。现在,如果我在聚合器之后有一些耗时的组件,我想不发布" B"直到线程处理" A"一切都完成了。请记住A和B正在由不同的线程处理。如果我发送" C"相关ID为" 2"我确实希望在" A"正在处理中。

所以这是理想的行为,令人惊讶的是,这正是它的运作方式。因此聚合器正在按预期处理锁定逻辑。我只是想了解这是怎么发生的,这意味着聚合器在释放消息组之前放置锁,然后释放锁,直到处理完所有组件后,基本上已经调用了postSend。看看上面提到的类的代码,似乎在释放消息后释放了锁,但这不是我在运行我的示例时看到的。相反,锁定将保持到聚合器完成后的所有下游组件。我希望得到一些澄清。感谢。

1 个答案:

答案 0 :(得分:0)

稍微简化它的逻辑看起来像:

lock.lockInterruptibly();
try {
   completeGroup(message, correlationKey, messageGroup);
}
finally {
    lock.unlock();
}

我认为应该同意我的看法,unlock()只有在completeGroup()完成工作后才能完成。最后一个可以做任何艰苦而漫长的工作,lock将一直持有。

因此,如果您的下游流程(聚合器的output-channel的子驱动程序)是单线程的(所有端点都与DirectChannel绑定),则lock将无法解锁那些终点将完成他们的工作。 MessageHandler订阅频道并向频道发送消息。一切都在同一个Call Stack中完成。