Programa Scheduler.
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.TimeZone; import java.util.Map; /* * El objetivo de este programa es hacer una planificador (scheduler) * que haga tareas rutinarias ya sea a petición o por horario * * Realizado por José Corona Alcántara */ public class p001_Scheduler { /* * Se crean variables privadas para los nombres de los archivos * Y se crean sus métodos setters y getters para manipular sus * valores. A esto se le llama encapsulamiento */ private String mFAmbiente; private String mFProgramada; private String mfInmediata; private String MfDirTrabajo; private List arrPeticiones=new ArrayList(); public String getmFAmbiente() { return mFAmbiente; } public String getMfDirTrabajo() { if (MfDirTrabajo==null) MfDirTrabajo=""; return MfDirTrabajo; } public void setMfDirTrabajo(String mfDirTrabajo) { MfDirTrabajo = mfDirTrabajo; } public void setmFAmbiente(String mFAmbiente) { this.mFAmbiente = mFAmbiente; } public String getmFProgramada() { return mFProgramada; } public void setmFProgramada(String mFProgramada) { this.mFProgramada = mFProgramada; } public String getMfInmediata() { return mfInmediata; } public void setMfInmediata(String mfInmediata) { this.mfInmediata = mfInmediata; } private void PeticionesProgramadas(Long ll_fhinicio, Long ll_fhfin){ String lsNbFile=this.getMfDirTrabajo()+File.separator+this.getmFProgramada(); File f=new File(lsNbFile); BufferedReader br; String ls_linea; String[] arrPet; int liEncontradas=0; String ls_fhactual; long ll_fhactual=0; if (!f.exists()) { System.out.println("No existe el archivo de peticiones programadas: "+lsNbFile); return; } try { br=new BufferedReader(new FileReader(new File(lsNbFile))); ls_fhactual=(new SimpleDateFormat("yyyyMMdd").format(new Date())); while ((ls_linea=br.readLine())!=null){ arrPet=ls_linea.split("\\|"); if (arrPet[0].length()!=5){ System.out.println("Formato de hora erróneo (hh:mm): "+arrPet[0]); continue; //Se sigue a la siguiente iteracción del ciclo que está } ll_fhactual=Long.valueOf( ls_fhactual.concat(arrPet[0].substring(0,2)+ arrPet[0].substring(3,5))); //Empieza a cargar peticiones después de la hora siempre que este en el rango if (ll_fhinicio<=ll_fhactual && ll_fhactual<=ll_fhfin) for (int i=1;i<arrPet.length;i++){ liEncontradas++; arrPeticiones.add(arrPet[i]); } } if (liEncontradas>0) System.out.println("Peticiones programadas encontradas: "+ liEncontradas+ " peticiones en el archivo "+ lsNbFile ); } catch(Exception e){ System.out.println(e.getMessage()); } } private void PeticionesInmediatas(Calendar lfh){ Boolean lbRes; String lsNbFile=""; File f=new File(this.getMfDirTrabajo()+File.separator+this.getMfInmediata()); BufferedReader br; String ls_linea; String[] arrPet; int liEncontradas=0; if (!f.exists()) { System.out.println("No existe el archivo de peticiones Inmediatas: "+ this.getMfDirTrabajo()+File.separator+this.getMfInmediata()); return; } lsNbFile=(this.getMfDirTrabajo()+ File.separator+ (new SimpleDateFormat("yyyyMMddHHmmss")).format(lfh.getTime())).toString()+ "_"+ this.getMfInmediata(); if (!f.renameTo(new File(lsNbFile))) { System.out.println("No se pudo renombrar el archivo: "+ this.getMfDirTrabajo()+ File.separator+this.getMfInmediata()); return; } try { br=new BufferedReader(new FileReader(new File(lsNbFile))); while ((ls_linea=br.readLine())!=null){ arrPet=ls_linea.split("\\|"); for (int i=0;i<arrPet.length;i++){ liEncontradas++; arrPeticiones.add(arrPet[i]); } } if (liEncontradas>0) System.out.println("Peticiones inmediatas encontradas: "+ liEncontradas+ " peticiones en el archivo "+ lsNbFile); } catch(Exception e){ System.out.println(e.getMessage()); } } private void PausandoAplicacion() { System.out.println("Tarea 002 Pausand 5 minutos el aplicativo"); //La cláse Thread pide que se cache la excepción try { Thread.sleep(5*60*1000); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.println("Tarea 002 terminada con éxito"); } private Boolean EjecutaPeticiones(){ boolean lbEncontrada; for (int i=0;i<arrPeticiones.size();i++) { lbEncontrada=false; if ("001".equals(arrPeticiones.get(i))) { ImprimeAmbiente(); lbEncontrada=true; } if ("002".equals(arrPeticiones.get(i))) { PausandoAplicacion(); lbEncontrada=true; } if ("003".equals(arrPeticiones.get(i))) { System.out.println("Tarea 003 Finalizar Scheduler"); return false; } if (!lbEncontrada) { System.out.println("Tarea "+arrPeticiones.get(i)+" no encontrada"); } } return true; } private void ImprimeAmbiente(){ FileWriter fw; System.out.println("Tarea 001, generando archivo con variables de ambiente"); try { fw= new FileWriter(this.getMfDirTrabajo()+File.separator+this.getmFAmbiente()); Map<String, String> env = System.getenv(); for (String envName : env.keySet()) { fw.write(envName); fw.write("="); fw.write(env.get(envName)); fw.write("\r\n"); } fw.write("Directorio Trabajo: "+this.getMfDirTrabajo()); fw.write("\r\n"); fw.close(); } catch (Exception e) { System.out.println(e.getStackTrace()); } System.out.println("Tarea 001 completada con éxito"); } /* * Se declara el método ejecuta con acceso publico * que no regresa ningún valor pero que a partir de este * se empieza a ejecutar el programa de la clase p001_inicio */ public void ejecuta(){ //Uso de Calendar para hacer un planificador //Cada Calendar debe crear su propia instancia, si se igualan // son los mismos objetos Calendar lfh_actual=Calendar.getInstance(); Calendar lfh_tope=Calendar.getInstance(); Calendar lfh_r1=Calendar.getInstance(); Calendar lfh_r2=Calendar.getInstance(); boolean lbEjecuta=true; SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy HH:mm"); lfh_actual.setTimeZone(TimeZone.getTimeZone("America/Mexico_City")); lfh_tope.setTimeZone(TimeZone.getTimeZone("America/Mexico_City")); sdf.setTimeZone(TimeZone.getTimeZone("America/Mexico_City")); //Se igual la fecha tope a la actual lfh_tope.setTime(lfh_actual.getTime()); if (this.getMfDirTrabajo().equals("")) this.setMfDirTrabajo(Paths.get("").toAbsolutePath().toString()); System.out.println("Iniciando proceso: "+lfh_actual.getTime()); while (lbEjecuta){ /* *Con el método before de la clase Calendar vemos si *la fecha tope es menor que la actual y como la fecha actual *no puede rebasar a la fecha tope pues las igualamos */ if (lfh_tope.before(lfh_actual)) lfh_tope.setTime(lfh_actual.getTime()); /* * Si la fecha tope es igual a la actual vemos si hay * actividades planeadas para ese lapso */ if (lfh_actual.equals(lfh_tope)) { lfh_tope.add(Calendar.MINUTE, 1); lfh_r1.setTime(lfh_actual.getTime()); lfh_r2.setTime(lfh_tope.getTime()); lfh_r2.add(Calendar.MINUTE, -1); System.out.println("Buscando peticiones del día: "+ sdf.format(lfh_r1.getTime())+ " al día: "+ sdf.format(lfh_r2.getTime()) ); System.out.println("Directorio de trabajo: "+this.getMfDirTrabajo()); arrPeticiones.clear(); PeticionesInmediatas(lfh_actual); PeticionesProgramadas( Long.valueOf((new SimpleDateFormat("yyyyMMddHHmm")).format(lfh_r1.getTime())), Long.valueOf((new SimpleDateFormat("yyyyMMddHHmm")).format(lfh_r2.getTime()))); lbEjecuta=EjecutaPeticiones(); } /* * Actualizamos la fecha actual a una nueva instancia de la * clase Date */ lfh_actual.setTime(new Date()); } //while System.out.println("Fin del programa: "+sdf.format(lfh_actual.getTime())); } public static void main(String args[]){ /* * Se declara la variable local luo que es de tipo igual a * la clase p001_inicio y se instancia para poder utlizarla * con new p001_inicio(); * * La palabra reservada new es para instanciar las clases * luego le mandamos los nombres de los archivos de nuestro} * scheduler. * * Ya instanciada llamamos al método público ejecuta() */ p001_Scheduler luo=new p001_Scheduler(); //En este archivo se almacena un reporte del ambiente luo.setmFAmbiente("Ambiente.txt"); //En este archivo se almcenan peticiones a ejecutar de inmediato luo.setMfInmediata("Ejecuta.txt"); //En este archivo se almacenan peticiones a ejecutar a cierta hora luo.setmFProgramada("Scheduler.txt"); //Se manda a ejecutar nuestra clase luo.ejecuta(); } }