2014-02-21 51 views
0

我正在建立一个系统,它有一个基本的产品消费者的范例味道,但生产者部分需要在交易模式。 这是我确切的情况:BlockingQueue内部交易java

Poller Thread - 
[Transaction START] 
    Polls the DB for say 10 records 
    * Sets the status in DB for those records as IN-Progress 
    * Puts the above 10 records in a LinkedBlockingQueue - workqueue 
[Transaction END] 

Worker Thread Pool of 5 
    * Polls the workqueue for the tasks, do some lookups and update the same records in DB with some looked up values. 

现在我的问题是1的过程的一部分,因为如果让说,一些原因,我的提取和更新由DB是成功的,但在队列中插入的过程,一个失败记录,我可以回滚整个事务,并且我的数据库中的所有记录都将处于NOT Processed状态,但可以在此工作队列中插入一些元素,并且我的工作线程池可以拾取它们并开始处理,而不应该发生。

试图找到是否有办法以跨国的方式写入到blockingqueue。

考虑添加一些writelock()readlock()机制,如果我可以阻止工作线程读取队列中正在写入的内容。

任何想法为更好的方法。

感谢,

回答

0

考虑最坏的情况:拔下的情况下(数据库连接丢失)和碰撞的情况下(程序内存不足)。你将如何从那里恢复?

一些提示:

  • 如果你能想到的一个原因,在队列中插入会失败(队列已满),不要启动事务。只需跳过一次投票。
  • 首先提交正在进行的事务,然后将所有记录添加到工作队列中。或者对每个记录使用一个事务,以便您可以逐个将记录添加到工作队列中。
  • 维护正在处理的所有记录的ID的内存HashSet。如果该ID在该组中,但该记录未处于进行中,反之亦然,则某些内容非常错误(例如记录任务未完成/坠毁)。
  • 设置进行中设置的时间戳。让另一个后台进程检查正在进行太久的记录。如果ID不在进行中的HashSet中,则重置正在进行的状态,并且正常进程将重试操作。
  • 使你的任务幂等:看看你是否能找到一种方式,任务可以识别已经完成的记录工作。这可能是一个相对昂贵的操作,但它可以保证只有在重试的情况下才能完成工作。