我有一个生产者/消费者模式,如下所示
每个生产者都在运行数据库查询,并将结果写入其队列。消费者调查所有的生产者队列。目前,如果存在数据库错误,生产者线程就会死掉,然后消费者就会永远被困在产品队列上等待更多的结果。
我应该如何构造这个以正确处理捕获错误?
发布于 2012-05-04 10:00:49
我曾经做过一件类似的事情,并决定使用一个哨兵值,即将死的生产者线程将从catch块推入队列中。您可以推送异常本身(在大多数情况下都是这样),也可以有一个特殊的对象。无论如何,为了调试目的将异常推给使用者是很好的。
发布于 2012-05-04 09:58:17
看来,当生产者死亡时,唯一的选择就是停止消费者。
要做到这一点,你可以使用毒丸。这是一个特殊的对象,生产者在停止时添加它,消费者在收到它时知道停止。毒丸可以添加到finally块中,因此无论生产者是如何被杀死或死亡,它总是被添加。
如果您只有一个用户,我将使用一个队列。这样,你的消费者只会阻止所有的生产者已经死亡。
发布于 2012-05-04 10:28:12
不管您实际推到队列/s是什么类,它都应该包含成功/失败/错误成员,这样消费者/s就可以检查失败了。
Peter已经建议只使用一个队列--我看不出如何避免所有这些轮询都是特定的问题--队列中的对象可以有成员来标识他们来自哪个生产者,如果需要的话,还有任何其他元数据。
https://stackoverflow.com/questions/10446598
复制相似问题