Java Apache骆驼幂等消费模式是用jdbcMessageIdRepository线程安全实现的吗?

Java Apache骆驼幂等消费模式是用jdbcMessageIdRepository线程安全实现的吗?,java,jdbc,apache-camel,apache-karaf,idempotent,Java,Jdbc,Apache Camel,Apache Karaf,Idempotent,我需要在Camel(2.23.0)中实现,并且正在研究可能的实现。目前,我只能实现or,我想知道这些实现在处理并发请求时是否是线程安全的?我在Camel Github中检查了这些类的源代码,但找不到任何阻止/处理并发访问的代码 有人能证实这一点吗?非常感谢 简短回答:是(在带有主键的DB表上) Long answer:我今天试用了它(使用JMeter的Parallel Controller插件),注意到如果我没有在CAMEL\u MESSAGEPROCESSED表上设置主键,我会在同时触发多个

我需要在Camel(2.23.0)中实现,并且正在研究可能的实现。目前,我只能实现or,我想知道这些实现在处理并发请求时是否是线程安全的?我在Camel Github中检查了这些类的源代码,但找不到任何阻止/处理并发访问的代码


有人能证实这一点吗?非常感谢

简短回答:是(在带有主键的DB表上)


Long answer:我今天试用了它(使用JMeterParallel Controller插件),注意到如果我没有在
CAMEL\u MESSAGEPROCESSED
表上设置主键,我会在同时触发多个HTTP请求时得到重复的条目。但是,如果我将主键添加到此表中(正如camel文档所建议的那样),则
幂等
使用者的行为与预期一致

可以安全地说,同步由表上的主键机制负责吗

我的意思是,只有一个
请求线程
成功地将一行添加到
CAMEL_MESSAGEPROCESSED
表中,从我在测试期间观察到的情况来看,另一个
请求
被标记为重复

Camel (exchangeProperty(Exchange.DUPLICATE_MESSAGE)=true)

即使使用eager=true(默认值),代码级别的Camel也无法可靠地防止同时处理的重复交换插入(例如,在高负载情况下)。两家交易所可能会发现,回购协议中还没有这把钥匙,于是就插入了这把钥匙。要可靠地筛选出重复项,如您所发现的,必须在messageId字段上设置唯一约束/PK(此外,还要设置eager=true)。不过,我在文档中找不到这样做的建议,不是因为它的幂等消费者功能。@SebastianBrandt查看以下URL下的“使用基于JDBC的幂等存储库”一段:。在某个地方,它说“我们建议对processorName和messageId列有一个唯一的约束。”但它没有明确说明并发访问场景需要这样做:)谢谢,我错过了。