2016-12-05 111 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