Es posible reiniciar un trabajo en la primavera de lote con el mismo trabajo params, que ha completado con éxito?

Decir que tengo un trabajo con un paso que se lee de un archivo y escribe a otro.

Para el propósito de la prueba, que necesita para ejecutar el trabajo de nuevo y de nuevo. Sin embargo, yo no quiero que el trabajo param (que es la fecha de hoy que estoy leyendo de una tabla) para cambiar una y otra vez.

Es un escenario posible ?

OriginalEl autor Vicky | 2012-02-01

4 Comentarios

  1. 4
    Long startNextInstance(String jobName) 
          throws NoSuchJobException, JobParametersNotFoundException, JobRestartException, 
                 JobExecutionAlreadyRunningException, JobInstanceAlreadyCompleteException;
    

    Este método de la JobOperator clase junto con un JobParameterIncrementer puede ser utilizado para reiniciar un puesto, ya sea por error o completado.

    http://static.springsource.org/spring-batch/apidocs/org/springframework/batch/core/launch/support/SimpleJobOperator.html#startNextInstance(java.lang.String)

    Todavía no puedo entender por qué algunos de lógica se encuentra en JobOperator y algunos en JobLauncher. Como para mí, estos dos deberían fusionarse. Finalmente he creado el equivalente semánticamente código de startNextInstance() en mi proyecto.
    Estoy totalmente de puede relacionar a su frustración con la forma de las APIs están dispersos en varias clases. Realmente no puedo entender cómo estas Api nunca se hizo, sin una razón válida para hacerlo.
    docs.de la primavera.io/primavera-lote/trunk/referencia/html/… Citando: Accenture ha contribuido anteriormente propiedad de procesamiento por lotes de la arquitectura de los marcos, sobre la base de décadas de experiencia en la construcción de lote de arquitecturas con las últimas generaciones de plataformas, (es decir, COBOL/Mainframe, C++/Unix, y ahora Java/en cualquier lugar) para la Primavera de Lotes del proyecto junto con los sujetos del delito recursos a la unidad de apoyo, mejoras, y la futura hoja de ruta.
    El JobOperator es una interfaz JSR-352 requisito. Todos sabemos que la Primavera lote precede a la JSR y una gran cantidad de superposición funcional es inevitable

    OriginalEl autor user1201659

  2. 4

    Primavera Lote requiere único de los parámetros de trabajo para su ejecución.así que usted puede agregar la hora actual como un parámetro del trabajo

    Map<String, JobParameter> confMap = new HashMap<String, JobParameter>();
    confMap.put("time", new JobParameter(System.currentTimeMillis()));
    JobParameters jobParameters = new JobParameters(confMap);
    jobLauncher.run(springCoreJob, jobParameters);
    

    OriginalEl autor Jijo

  3. 3

    Primavera Lote requiere único de los parámetros de trabajo para su ejecución.
    En su caso, si desea ejecutar el mismo trabajo con el mismo parámetro de fecha, de lo que se puede «añadir» otro parámetro del trabajo la hacen única. Usted puede pensar que es único trabajo conjunto de parámetros.

    org.springframework.batch.core.JobParametersIncrementer interfaz se puede utilizar en este escenario, justo dar JobParameter y se agregará una ejecución.id que le hacen único.

    public class SampleIncrementer implements JobParametersIncrementer {  
    
        public JobParameters getNext(JobParameters parameters) { 
            if (parameters==null || parameters.isEmpty()) {
                return new JobParametersBuilder().addLong("run.id", 1L).toJobParameters();
            }
            long id = parameters.getLong("run.id",1L) + 1;
            return new JobParametersBuilder().addLong("run.id", id).toJobParameters();
        } }
    

    Usted puede comprobar un ejemplo sencillo de usarlo

    La primavera Lote tiene una clase que ya hace esto: org.springframework.por lotes.núcleo.el lanzamiento.apoyo.RunIdIncrementer
    «La primavera de los Lotes requiere único de los parámetros de trabajo para su ejecución» => requisito que no tiene ningún sentido para mí

    OriginalEl autor Serkan Arıkuşu

  4. 0

    Tengo esta función

    public void run()
    {
        LOG.info("Processing batch...");
        try
        {
            Job job = createNewJob();
            JobParameters jobParameters = new JobParameters();
            Optional<JobInstance> existingInstance = jobExplorer.getJobInstances(job.getName(), 0, 1).stream().findFirst();
            if (existingInstance.isPresent())
            {
                jobParameters = job.getJobParametersIncrementer().getNext(jobParameters);
                LOG.warn("Trying to restart task \"{}\" with the parameters [{}]", job, jobParameters);
            }
            jobLauncher.run(job, jobParameters);
        }
        catch (JobExecutionAlreadyRunningException ex)
        {
            LOG.warn("The task \"{}\" is already running", BillingBatchConfig.QUALIFIER);
        }
        catch (JobRestartException ex)
        {
            LOG.warn("The task \"{}\" cannot be restarted", BillingBatchConfig.QUALIFIER);
        }
        catch (JobInstanceAlreadyCompleteException ex)
        {
            LOG.warn("The task \"{}\" cannot be restarted cause its finished", BillingBatchConfig.QUALIFIER);
        }
        catch (JobParametersInvalidException ex)
        {
            LOG.warn("The task \"{}\" cannot be excecuted cause the parameters are invalid", BillingBatchConfig.QUALIFIER);
        }
        catch (Exception ex)
        {
            LOG.warn("Unexpected error running the task \"{}\"", BillingBatchConfig.QUALIFIER);
        }
    }
    

    La clave es comprobar si hay una instancia existente de org.springframework.batch.core.explore.JobExplorer en la base de datos de la querían de trabajo. Si su por tanto, el trabajo debe iniciarse con los parámetros obtenidos por job.getJobParametersIncrementer().getNext(jobParameters). Eso es todo.

    OriginalEl autor EliuX

Dejar respuesta

Please enter your comment!
Please enter your name here