2017-06-28 15 views
0

私は、特定の時点(将来的には長時間、おそらくは数週間)に実行される一連のタスクを持っています。私の計画は、時間が来るまで待つスレッドごとに作成することでした。タスクの数が非常に多いので、私はこれらのスレッドを組み合わせると(何もしない/待つ)多くのリソースを消費することに懸念しています。私の質問は、スレッドがリソースを消費しているかどうかです。スケーラで長い時間間隔でタスクスケジューリング

は、これは本当にScalaの固有の問題ではありません

+0

私は一番簡単な解決策は、サービスを作成してcronに追加して1日1回などのスケジュールを立てるようにすることだと思うので、仕事のように1日1回実行されます。単にスケジュールする必要のあるタスクではありません。スケーラ固有の実装の場合、私はあなたがAkkaを見るべきだと思う:http://doc.akka.io/docs/akka/current/scala/scheduler.html – Pavel

答えて

0

(私は、タスクのデータベースを作成し、常にいずれかが実行されるべきかどうかを確認するために、それを反復処理することも、あまり効率的であることがasume)。

スレッドが長時間待機する問題は、アプリケーションがその間にクラッシュしたり、停電などが発生した可能性があることです。

データベースに保存するのは、私にとっては簡単な解決策です。常にすべての項目を繰り返し処理すれば、かなり時間がかかることになります。しかし、あなたがソートできるデータベースに「due」フィールドがある場合、これはかなり効率的です。明らかに、このような操作を効率的にサポートする適切なデータベースを選択する必要がありますが、実際には、アプリケーションの再起動後に正常に動作し続ける信頼性の高いシステムを構築できます。

0

特定の時点でジョブをスケジュールする必要がある場合は、http://www.quartz-scheduler.org/のようなジョブスケジューラを使用することをお勧めします。 それはかなり広範囲だとあなたは簡単のようなジョブを作成し、スケジュールすることができます。それはあなたが、もちろん簡単に(SO hereを参照)やスカラ座の中にそれを使用することができますJavaライブラリですので

public class MyJob implements org.quartz.Job { 

     public MyJob() { 
     } 

     public void execute(JobExecutionContext context) throws JobExecutionException { 
      System.err.println("Hello World! MyJob is executing."); 
     } 
} 

    JobDetail job = newJob(MyJob.class) 
     .withIdentity("job1", "group1") 
     .build(); 

    // Trigger the job to run now, and then repeat every 40 seconds 
    Trigger trigger = newTrigger() 
     .withIdentity("trigger1", "group1") 
     .startNow() 
     .withSchedule(simpleSchedule() 
       .withIntervalInSeconds(40) 
       .repeatForever()) 
     .build(); 

    // Tell quartz to schedule the job using our trigger 
    scheduler.scheduleJob(job, trigger); 

Akka(@Pavel)を使用するオプションについてとにかくAkkaを使用しておらず、スケジューラ機能しか必要ない場合は、Quartzに行きます。 Akkaを使用している(または使用予定の)場合、現在または特定の期間にX週/日/時間稼働するジョブのみが必要な場合は、Akkaスケジューラを使用できます。特定の日付と時刻のようなより複雑なセマンティクスが必要な場合は、Quartzを見てみましょう。