我的应用程序(Java)随机产生一些任务,并由分布式后台线程异步使用。
我目前还没有像ZooKeeper这样的分布式锁解决方案。我没有任何第三方消息队列。
我使用数据库作为任务队列,所使用的结果也保存在数据库中,所有使用者/生产者共享访问权限。
我有这样的代码:
消费者:
while(true) {
// block the thread and wait from producer's notify
// my producers would produce MANY work items but only notify each consumer ONCE.
waitProducer();
// consume the queue
while(database.queueNotEmpty()) {
// consume each work item and remove from database queue
consumeAll();
}
}制片人:
for(...) {
database.enqueue(work[i]);
}
// notify all consumers
notifyAllConsumer();显然,上面的代码存在并发错误。我有三个问题:
1.如何避免分布式消费者使用相同的任务?(关于行:"consumeAll()")或减少重复计算。多次使用一个任务并不是一个错误,但在我的情况下效率较低。
2.如何避免队列不是空的,而是没有使用者活动的?顺序是:一个消费者和一个生产者样本:
3.对这一问题有何最佳做法?尤其是纯java。第三方消息队列或类似动物园管理员之类的东西是必须的吗?更少的锁或没有锁是首选的;在我的情况下,效率优先于正确性。
谢谢!
发布于 2014-08-01 05:45:26
我建议您在这种情况下使用LinkedBlockingQueue。
LinkedBlockingQueue教程
您可以使用put() /put()方法,如果您想在timelimit中等待,可以使用methods ()、poll()和peek()。
我也用这个来解决类似的问题。
https://stackoverflow.com/questions/23889764
复制相似问题