【问题标题】:MDB is inserting duplicate recordsMDB 正在插入重复记录
【发布时间】:2014-07-11 06:16:47
【问题描述】:

我正在使用 JBOSS 5.1.2 MDB 来使用放置在队列中的实体消息。消息生产者可以为同一个实体生成多条消息。这些消息实体由它们的实体编号定义。 (msg_entity_no) 仅当实体不存在时,我必须将记录插入现有实体表,否则我必须更新现有记录。 现有实体表在此实体编号上不是唯一的,因为它具有另一个内部键。即它包含重复的 msg_entity_no

我遇到的问题是,当产生多条消息时,MDB 查询的多个实例同时存在于实体表上。 那时,这两个实例都不存在,然后该进程插入两个消息。与插入不存在的实体相反 然后为后续消息更新记录。

我想摆脱使用注释 @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1") 并部署到仅允许一个 MDB 实例的 deploy-hasingleton 文件夹,因为这是不可扩展的。

【问题讨论】:

  • 你是在集群环境下运行的吗?
  • 你的主键是怎么定义的?
  • 我们处于集群环境中。该表有一个主键和另一个内部实体编号。
  • @Patrick 能否将 MDB 限制为集群中的一个实例?即一个 jboss 实例上只有一个 mdb 实例?
  • @KennethClark 我们设法通过 maxSession 注释和 deploy-hasingleton 文件夹实现了这一点,但是如果该实例发生故障,则将不再使用消息。

标签: java oracle queue ejb-3.0 jboss5.x


【解决方案1】:

您收到的情况是由于DUPLICATESAME DATA 包含在快速连续放入队列中的消息中。有几个解决方案。

1) DEQUEUE 在一个只有一个 mdb 的 JBOSS 实例上。这意味着您将在集群中的一个 JBOSS SERVER 上运行一个 MDB,消息将基本上按顺序处理。

2) 创建一个锁定机制,通过该机制创建一个表,使用 PRIMARY KEY 和消息内容将消息内容写入该表。然后,您可以根据内容过滤掉或创建要处理的数据排序。这将减慢执行时间,但您将对数据进行更好的审计。实质上,您将拥有两个ASYNC 流程作业。一个用于从QUEUE 填充您的数据,另一个用于处理数据。您可以在一分钟后执行此操作。

3) 一些 QUEUE 实现(例如 ORACLE AQ)有一个可以设置的dequeue condition 队列中的消息根据条件进行评估,并返回满足给定条件的消息。 TIBCO 有锁定策略,当代理中有多个线程时,它可以保护执行线程。

参考资料 http://tech.chococloud.com/archives/2152

不了解业务流程,建议您尝试从源头阻止“重复”消息。

【讨论】:

  • 谢谢...选项 2 听起来对我来说是可行的。而且您对污染源的看法是正确的,将首先尝试在那里解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
相关资源
最近更新 更多