2017-02-04 10 views
2

使用するScheduledExecutorService hazelcastから3.8メモリ不足例外があります。物事は、私は1日中にいくつかのイベントについてユーザーに思い出させるべきサービスを作っている。タスクの実行はフォールトトレラントでなければなりません。 ユーザーはScheduledExecutorServiceのタスクである新しいリマインダを設定します。したがって、タスクの量は1日に数千人になる可能性があります。各タスクは、スケジュール(Runnableコマンド、ロングディレイ、TimeUnitユニット)を使用してワンショットアクションとしてスケジューラに追加されます。遅延は24時間を超えることはできません。テストをしてループでタスクを追加し始めたとき、私は例外を持っています。私は実行後の仕事がメモリから削除されると思ったが、おそらく私は間違っていた。Hazelcast ScheduledExecutorService

あなたは、いくつかの質問には答えることができます:

  1. タスクが実行後にメモリから削除されるべきか?
  2. これを行うための設定はありますか?
  3. 多くのワンショットアクションタスクにScheduledExecutorServiceを使用できますか?
  4. hazelcastビットと私の課題を解決するための別の方法がありますすることはScheduledExecutorService

答えて

2
  1. はい
  2. future.disposeを()を使用していません。
  3. あり
  4. はい、ある頻度でスケジュールされた実行プログラム・サービスを実行させることができ、サービスの実行がすべての反復で同じである場合、そのユーザーの優先順位をチェックできます。

 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

future.Dispose()は、scheduledTaskが実行中またはキャンセルされたときにいつでも呼び出される必要があると思います。多くのタスクをスケジューリングしようとすると、たとえそれぞれが実行されたとしても、「最大容量に達しました」ということになります。 – bachden

0

我々は一定の遅延後のRunnableタスクを実行するようにスケジュールエグゼキュータのサービスを使用しますが、タスクの実行後にメモリから削除されていなかったように見えています。 executorService.getAllScheduledFutures()を反復して検証し、サイズを確認します。

+0

@slppery - 実行後に削除されますか? – Hiten