首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生产者消费者模式-处理生产者失败

生产者消费者模式-处理生产者失败
EN

Stack Overflow用户
提问于 2012-05-04 09:55:09
回答 5查看 1.1K关注 0票数 1

我有一个生产者/消费者模式,如下所示

  • 一个固定数量的生产者线程,每个线程写到自己的BlockingQueue上,通过一个执行器
  • 调用--一个使用者线程,读取生产者线程

每个生产者都在运行数据库查询,并将结果写入其队列。消费者调查所有的生产者队列。目前,如果存在数据库错误,生产者线程就会死掉,然后消费者就会永远被困在产品队列上等待更多的结果。

我应该如何构造这个以正确处理捕获错误?

EN

回答 5

Stack Overflow用户

发布于 2012-05-04 10:00:49

我曾经做过一件类似的事情,并决定使用一个哨兵值,即将死的生产者线程将从catch块推入队列中。您可以推送异常本身(在大多数情况下都是这样),也可以有一个特殊的对象。无论如何,为了调试目的将异常推给使用者是很好的。

票数 4
EN

Stack Overflow用户

发布于 2012-05-04 09:58:17

看来,当生产者死亡时,唯一的选择就是停止消费者。

要做到这一点,你可以使用毒丸。这是一个特殊的对象,生产者在停止时添加它,消费者在收到它时知道停止。毒丸可以添加到finally块中,因此无论生产者是如何被杀死或死亡,它总是被添加。

如果您只有一个用户,我将使用一个队列。这样,你的消费者只会阻止所有的生产者已经死亡。

票数 1
EN

Stack Overflow用户

发布于 2012-05-04 10:28:12

不管您实际推到队列/s是什么类,它都应该包含成功/失败/错误成员,这样消费者/s就可以检查失败了。

Peter已经建议只使用一个队列--我看不出如何避免所有这些轮询都是特定的问题--队列中的对象可以有成员来标识他们来自哪个生产者,如果需要的话,还有任何其他元数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10446598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档