2012-12-14 32 views
0

我有一個基於Java的Bukkit插件(與手頭上的問題非常相關,但值得注意),它將每30分鐘查詢一次Web API以便將更新傳遞給用戶。如何迭代一次會改變幾次的對象數組,但同時確保所有項都被迭代?

這是現有的方法,其工作細到每一個用戶傳給API:

public ApiMessenger() 
{   
    TASK_ID = Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin,new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      if(Bukkit.getOnlinePlayers().length > 0) 
      { 
       ApiMessenger.fetchPlayerItems(Bukkit.getOnlinePlayers(),true); 
      } 
     } 
    }, 20*60*30, 20*60*30); 
} 

然而,API會接受的,頂多30個用戶在同一時間。

因此,任何使用此插件的服務器一次擁有30個以上的用戶將無法一次提交所有用戶,因爲其餘部分將被忽略。

我想弄清楚什麼樣的設置可以讓我用某種形式的時間戳存儲所有用戶,以便上面顯示的ApiMessenger方法可以記住哪些用戶已發送並嘗試發送那些一直等待最長時間才能進行更新的人。

我可以在用戶加入/離開時管理刪除/添加用戶,但我主要關心的是首先創建一個有序的數據結構,可以在30個用戶組發送時更新。

不幸的是,我不知道Java中的哪些數據類型可用於創建可以按升序迭代的結構。

+5

這非常含糊,我想你需要放下一些代碼,或者更清楚地討論一下需求。 「上次查詢用戶」對除了你以外的任何人都沒有任何意義。 – thatidiotguy

+4

理想情況下,您應該在註銷時註銷用戶,而不是定期註銷。但我不知道你的具體要求......我建議保持列表排序,而不是在你需要時對列表進行排序。 – jmrodrigg

+0

我同意以上兩點。做這件事的最好方法好像你想用某種監聽器觸發你的註銷,更新某種主列表,然後讓你的定期輪詢僅僅檢查主列表。 – Charles

回答

1

您是否考慮過使用隊列?你可以在Java here上閱讀它。當玩家登錄時,只需將它們添加到要處理的玩家隊列即可。然後,只需從列表中彈出30個項目並處理它們。你可以簡單地將這些用戶推到隊列後面。 如果玩家註銷,您可以將其從隊列中移除或在處理隊列時檢查他們是否在線。如果我理解正確 - 這應該讓你解決你的問題!

+0

這很完美,謝謝! –