2016-12-05 84 views
0

我正在使用Amazon SQS队列,我想要有两个队列,比如说一个具有高优先级任务的队列,以及其他具有低优先级任务的队列。优先选择与Java nio?

我想创建一个安装程序,我的应用程序在开始使用低优先级任务之前总是先消耗所有高优先级的任务(在我的情况下,饥饿是没有问题的)。

我的第一个想法是有两个cosumers,每个队列一个,从每个队列中获取消息并将它们放入一个java.util.PriorityQueue中,但我想避免插入(和排序/阻塞/同步)成本,因为会有大量的消息。

然后,我想到usign java.nio,但我不知道这是否可能。

我的想法是仍然有两个消费者,但现在他们把他们的任务放在两个nio.buffers(高优先级缓冲区,低优先级缓冲区)中,这些缓冲区绑定到nio.channels(高p。channel,low如果可能的话,选择器应该首先从高优先级信道消耗,然后从低优先级信道消耗。

我还没有找到配置此选择顺序的方法。这可能吗?

还有其他的选择吗?

在此先感谢。

回答

0

Amazon SQS提供查询未读邮件大小的功能。

当你想获得消息时,从高优先级SQS中查询未读消息大小,如果大于0,从高优先级获得消息,否则从低优先级sqs获得消息。

AWSQSClient.getQueueUnreadSize(String queue_name); 

这是怎么回事?

+0

hum ...这会在我的循环中添加另一个对SQS的请求(现在有两个:取消消息和确认/删除消息),每个消耗约20ms的时间。 在这一刻,我想更好的解决方案是简单地删除长轮询(设置为0毫秒),并循环两个队列。如果线程在优先级队列中发现了某些内容,则处理该消息。如果没有,则尝试从低优先级队列中获取消息,然后再次循环。 – weeanon