私は、Trade Automationサイト用のSpring 4 Rest APIを構築しています。Spring 4 TaskSchedulerのパフォーマンスの問題
は、サービス層でcronジョブを動的スプリングTaskScheduler.schedule(Runnable arg0, Date arg1)
を正確に一度、パラメータとして与えられた時に実行されるように、Runnable
を作成するインタフェースを使用して作成されます。このスレッドは、私のHibernate DAOレイヤーにアクセスするための別のサービスを呼び出し、将来何かを行います。
構成クラスと実装を以下に示します。
@Configuration
@EnableWebMvc
@EnableScheduling
@ComponentScan("com.example")
public class SpringMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
return new ThreadPoolTaskScheduler();
}
}
@Service
public class TransactionServiceImp implements TransactionService {
@Autowired
private TaskScheduler scheduler; //org.springframework.scheduling.TaskScheduler;
@Autowired
private TaskExecutorService taskService; //My service
@Transactional
public myFunction(){
//some code
final Long key = //some id value from db
Date exeTime = //some java.util.Date in future
Runnable runnable = new Runnable() {
private long id = key;
public void run() {
taskService.doSomething(id);
}
};
ScheduledFuture<?> sheduler = scheduler.schedule(runnable, exeTime);
//some code
}
}
このコードは正常に動作し、正確な時刻にタスクを実行し、正確に一度されます。日食のデバッグ、によって
その新しいデーモンスレッドは、(httpリクエストを処理する際に、MVC春に)呼ばれるたびscheduler.schedule()
を作成していることがわかりました。私の問題は
は、JVMが(むしろ指定 日時にスレッドを作成するよりも)各
scheduler.schedule()
コールに新しいデーモンスレッドを作成するというのが私の考えが正しいです、ありますか?作成デーモンスレッドはまだタスクが実行された後も Eclipseのデバッグに
Running
状態を示しています。スレッドは終了すると が破壊されたかどうかは確認されませんrun()
メソッド?それ以外の場合は、パフォーマンスの問題ですか?
使用TaskScheduler' 'これに依存して増加しません。また、代替案を検討したいかもしれません。タスクがスケジュールされていて、JVMがクラッシュしたときにタスクが無くなっても、それが問題でない場合は問題ありません。そうでなければ、石英のようなものを見たいかもしれません。 –
私は 'org.springframework.scheduling.TaskScheduler'インタフェースと' org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler'実装を使用しています。トランザクションステータスがdbに格納され、次の起動時にチェックされるため、JVMのクラッシュとタスクは問題になりません。 –