Social Icons

.

понедельник, 24 мая 2010 г.

Scheduler на JAVA: переодическое выполнение команды

Задача: один раз в 30 секунд писать в лог  HELLO WORLD

Решение:
Замечание 1. В решении используется Singleton. Единственная причина для этого - нежелание хранить ссылку на созданных шедуллер в своих ресурсах. Педполагается, что после запуска шедуллера свои ресурсы выгружаются полностью. А заново загружаются либо по внешней команде, либо по команде шедуллера.
Если в Ваших условиях задачи нет такого ограничения, если Ваше приложение остается в памяти и после запуска шедуллера - от Singleton вполне можно отказаться.
Замечание 2. Использование Singleton накладывает серьезные ограничения на количество Шедуллеров порожденных от одного класса. В частности, в приведенном примере нельзя создать более одного. Если требуется создать множество шедуллеров с одним обработчиком, то данный класс легко модифицировать, сохранив данные класса в массиве. Если же требуется создать множество шедуллеров с разными обработчиками то от концепции Singleton следует отказаться. 


import static java.util.concurrent.TimeUnit.*;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.logging.Logger;

public class CScheduled {
private static volatile CScheduled instance = null;

public static CScheduled getInstance(){
 if(instance == null)
  synchronized(CScheduled.class){
   if(instance == null)
    instance = new CScheduled();
  }
 return instance;
}

private Logger log = Logger.getLogger( CScheduled.class.getName() );
private final ScheduledExecutorService scheduler;
private final Workuper theWorkuper;
private ScheduledFuture theHandle = null;

private CScheduled(){
 this.scheduler = Executors.newScheduledThreadPool(1);
 this.theWorkuper = new Workuper();
}
public void start(){
 if(this.theHandle != null) stop();
 
 int nDelay = 30;
 this.theHandle = this.scheduler.scheduleAtFixedRate(this.theWorkuper, 0, nDelay, SECONDS);
 log.info("UScheduled started. Repeat will do every " + String.valueOf(nDelay) + " seconds");
}
public void stop(){
 if(theHandle == null) return;
 
 theHandle.cancel(true);
 theHandle = null;
 log.info("UScheduled stoped");
}

private class Workuper implements Runnable{
 public void run() {
  log.info( "UScheduled workup" );
  
  log.info( "HELLO WORLD" );

  log.info( "UScheduled complete" );
 }
}
}

Оригинал

Комментариев нет:

Отправить комментарий

 

Так говорил Учитель:

У хорошо написанной программы есть свой собственный рай, у плохо написанной — свой собственный ад.

Russian Developer

Взгляд его светел, усилия праведны, старания бесплодны, дело безнадежно ...