2017-02-04 65 views
2

使用ScheduledExecutorService來自hazelcast 3.8我有一個內存不足的例外。事情是我正在提供一項服務,應該在一天中提醒用戶關於某些事件。任務的執行應該是容錯的。 用戶設置了新的提醒,這是ScheduledExecutorService的一項任務,因此每天的任務數量可能幾千。每個任務使用時間表(Runnable命令,長延時,TimeUnit單元)作爲一次性動作添加到調度程序中。延遲時間不能超過24小時。當我開始在循環中進行測試並添加任務時,我有一個oom異常。我認爲執行後的任務將從內存中刪除,但可能我錯了。Hazelcast ScheduledExecutorService

你能回答幾個問題:

  1. 如果一個任務被執行後,從內存中刪除?
  2. 有什麼設置可以做到嗎?
  3. 我可以使用ScheduledExecutorService執行大量的一次性操作任務嗎?
  4. 有另一種方式來解決我的hazelcast位任務不使用ScheduledExecutorService的

回答

2
  1. future.dispose();
  2. 是的,您可以讓計劃的執行器服務以特定頻率運行,並且可以檢查用戶首選項,如果服務執行對於所有迭代都是相同的。

 HazelcastInstance instance = Hazelcast.newHazelcastInstance(); 
 

 
     IScheduledExecutorService scheduler = instance.getScheduledExecutorService("scheduler"); 
 
     IScheduledFuture future = scheduler.schedule(named("MyTask", 
 
       new EchoTask("foobar")), 1, TimeUnit.SECONDS); 
 

 
     Object result = future.get(); 
 
     System.out.println(future.getHandler().getTaskName() + " result: " + result); 
 

 
     future.dispose(); 
 

 
     System.out.println("Press any key to exit"); 
 
     System.in.read(); 
 
     Hazelcast.shutdownAll();

+0

我認爲futureTask()必須在scheduledTask運行或取消時隨時調用。當我嘗試安排很多任務時,我獲得了「達到最大容量」,即使是每個任務都執行完畢。 – bachden

0

我們使用的時間表執行服務運行延遲一定時間後一個Runnable任務,但看起來並沒有從內存中執行後刪除任務。我們通過遍歷executorService.getAllScheduledFutures()來驗證並檢查大小。

+0

@slippery - 執行後是否被刪除? – Hiten