MDB正在插入重复记录

时间:2014-05-22 09:33:13

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

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

我遇到的问题是,当生成多个消息时,MDB查询的多个实例同时存在于实体表中。 那时它对任何一个实例都不存在,然后进程插入两个消息。与不存在的实体的一个插入相反 然后更新后续消息的记录。

我想摆脱使用注释@ActivationConfigProperty(propertyName =“maxSession”,propertyValue =“1”)并部署到deploy-hasingleton文件夹,该文件夹只允许一个MDB实例,因为它不可扩展。 / p>

1 个答案:

答案 0 :(得分:0)

您收到的条件是由于邮件中包含的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

不了解业务流程,我建议您尝试阻止" DUPLICATE"来自消息来源的消息。