2017-08-11 43 views
0

我創建了一個完整的功能性批處理過程,我手動運行運行一個Launcher.java,它具有一個主方法並執行我定義的作業(此作業是我在xml中定義的,它作爲我的主要參數),這很好,現在我期望將它用於生產,爲此我需要配置該進程以在西班牙的每天早晨一天運行,我該怎麼做?這是我的啓動(如果我用鼠標右鍵單擊原樣運行> Java應用程序,它工作正常,但我怎麼做一個批處理,正如我需要它嗎?)在黎明時自動運行批處理

public final class Launcher { 

private static final String LOG_DECORATOR = "****************************************."; 
private static final Logger LOG = Logger.getLogger("batch"); 
private static final Long MIL = 1000L; 

private Launcher(){ 
    throw new UnsupportedOperationException(); 
} 

public static void main(String[] args){ 

    LOG.info(LOG_DECORATOR); 
    LOG.info(" INICIO DEL PROCESO "); 
    LOG.info(LOG_DECORATOR); 

    LOG.info("Cargando datos de configuracion"); 

    final ApplicationContext applicationContext = new ClassPathXmlApplicationContext(args[0]); 

    final PropertyFacade property = applicationContext.getBean(PropertyFacade.class); 
    Assert.notNull(property, "Datos de configuracion no cargados correctamente"); 
    final String entorno = property.property("entorno"); 
    LOG.info("Entorno: ".concat(entorno)); 
    final JobLauncher jobLauncher = (JobLauncher) applicationContext.getBean("jobLauncher"); 
    final Job job = (Job) applicationContext.getBean("job"); 
    long tiempoComenzar; 
    long tiempoTerminar; 
    tiempoComenzar = System.currentTimeMillis(); 
    try { 
     final JobExecution execution = jobLauncher.run(job, new JobParameters()); 
     LOG.info("Job Status : " + execution.getStatus()); 
     LOG.info("Job completed"); 
    } catch (JobExecutionAlreadyRunningException e) { 
     LOG.info("Error Launcher: ".concat(e.toString())); 
     LOG.error("Exception Launcher",e); 
    } catch(IllegalArgumentException e){ 
     LOG.info("Error Launcher: ".concat(e.toString())); 
     LOG.error("Exception Launcher",e); 
    } catch(JobInstanceAlreadyCompleteException e){ 
     LOG.info("Error Launcher: ".concat(e.toString())); 
     LOG.error("Exception Launcher",e); 
    } catch(JobParametersInvalidException e){ 
     LOG.info("Error Launcher: ".concat(e.toString())); 
     LOG.error("Exception Launcher",e); 
    } catch(JobRestartException e){ 
     LOG.info("Error Launcher: ".concat(e.toString())); 
     LOG.error("Exception Launcher",e); 
    }finally { 
     ((ConfigurableApplicationContext) applicationContext).close(); 
     tiempoTerminar = System.currentTimeMillis(); 
     final long tiempoDedicado = (tiempoTerminar - tiempoComenzar)/MIL; 
     LOG.info(
       "Fin. Tiempo dedicado a la consulta: ".concat(String.valueOf(tiempoDedicado)).concat(" segundos.")); 
     LOG.info(LOG_DECORATOR); 
     LOG.info(" FIN DEL PROCESO "); 
     LOG.info(LOG_DECORATOR); 
    } 

} 

}

這是工作

click me

我感謝你的幫助。

+0

您的代碼與問題無關,與*相關的是:您的代碼在哪個操作系統上運行?它有一個內置的任務調度器嗎? (例如cron) – alfasin

+0

感謝您的回答,在Windows上運行,不,我不知道正在嘗試理解或知道如何執行的任務的程序員,該任務執行3個步驟,這些步驟在三類。 Java(3任務) – jaxonjma

+0

使用Quartz。它建立一個類似於cron的調度器。 http://www.quartz-scheduler.org/ – Dakoda

回答

0

作業調度是一個單獨的問題&您可以根據您具有的部署模型類型選擇您的選項。

1.如果您的輸出是需要作爲獨立應用程序運行的簡單jar文件,則可以使用cron這樣的簡單工具在UNIX *系統上安排它。

你可以繼續使用更多的專業工具,如石英等,如少數評論中提到的。

Here更多討論。

2.如果您正在部署某種服務器,那麼您可以使用@Scheduled註釋簡單地編寫自己的調度程序。 Here是詳細的文檔,這種調度提供了幾個選項,如-cron像表達式,固定延遲等

我有一個工作部署在Weblogic,我使用選項#2。您將需要您的工作啓動邏輯寫在此@Scheduled方法中使用JobLauncher。我正在使用cron表達式,並通過屬性將該cron表達式進行了外化。一旦您的應用程序部署完畢,此計劃將自動啓動您的工作。

希望它有幫助!