mejoras de configuración a los batch

5
Activar el comportamiento Skip en los batch El Skip es una característica de Spring Batch, que permite que un Batch no se detenga cuando uno de los elementos de la cola falla. En el proyecto cdes_batch_svr se creó el step stepWithSkippableAllException , el cual tiene habilitado el comportamiento de skip, este step puede ser usado como step padre en los batch que requieren el comportamiento del skip El step stepWithSkippableAllExceptionse encuentra en el XML /cdes_batch_svr/src/main/resources/batch/jobs/cmm/jobCmm.xml <step id="stepWithSkippableAllException"  abstract="true"> <tasklet > <chunk skip-limit ="10000"> <skippable-exception-classes > <include class="java.lang.Throwable"  /> </skippable-exception-classes > </chunk> </tasklet > </step> Para activar en un Step el comportamiento de Skip, se debe colocar como Step padre al step stepWithSkippableAllException” de la siguiente manera (prestar ate nción a lo marcado en verde):  <job id="jobDaeRegularizadaTerrestre" > <step id="stepJobDaeRegularizadaTerrestre"  parent="stepWithSkippableAllException" > <tasklet> <chunk reader="daeRegularizadaTerrReader"  processor="daeRegularizadaTerrProcessor"  commit-interval="1"> </chunk> </tasklet> <next on="COMPLETED"  to="stepJobDaeRegularizadaTerrestreCompleted" /> <next on="FAILED"  to="stepJobDaeRegularizadaTerrestreFailed" /> </step> <step id="stepJobDaeRegularizadaTerrestreCompleted" > <tasklet ref="ecuaPassCompletedTasklet"  transaction-manager="transactionManager" > </tasklet> </step> <step id="stepJobDaeRegularizadaTerrestreFailed" > <tasklet ref="ecuaPassECLfailedTasklet"  transaction-manager="transactionManager" > </tasklet> </step> </job> Si el job tiene configurado el skip sin usar el paso padre “stepWithSkippableAllException”, se recomienda ajustar su configuración para que lo use aplicando el siguiente cambio De esto <job id="BaBtBnddTrspDclActtJob" > <step id="stepBaBtBnddTrspDclActtJob" > <tasklet> <chunk reader="baBtBnddTrspDclActtReader"  writer="baBtBnddTrspDclActtWriter"  commit-interval="1" skip-limit="100"> <skippable-exception-classes> <include class="java.sql.SQLIntegrityConstraintViolationException"  /> <include class="org.springframework.dao.DuplicateKeyException"  /> </skippable-exception-classes> 

Upload: lorellan

Post on 10-Oct-2015

5 views

Category:

Documents


0 download

TRANSCRIPT

Activar el comportamiento Skip en los batchEl Skip es una caracterstica de Spring Batch, que permite que un Batch no se detenga cuando uno de los elementos de la cola falla.En el proyecto cdes_batch_svr se cre el step stepWithSkippableAllException, el cual tiene habilitado el comportamiento de skip, este step puede ser usado como step padre en los batch que requieren el comportamiento del skipEl step stepWithSkippableAllException se encuentra en el XML /cdes_batch_svr/src/main/resources/batch/jobs/cmm/jobCmm.xml Para activar en un Step el comportamiento de Skip, se debe colocar como Step padre al step stepWithSkippableAllException de la siguiente manera (prestar atencin a lo marcado en verde):

Si el job tiene configurado el skip sin usar el paso padre stepWithSkippableAllException, se recomienda ajustar su configuracin para que lo use aplicando el siguiente cambioDe esto

A esto (Quitando lo marcado en rojo y aadiendo lo que est marcado en verde)

Activar notificador va email de un evento skipCon el fin de que los errores generados en los batch sean notificados va email a los desarrolladores, se cre la clase ec.gob.aduana.ecuapass.bat.cmm.listener.SkipListener.

Tambin se crearon beans que heredan de esta clase, para cada uno de los mdulos del ECUAPASS. Los nombres de estos beans tienen el sufijo del cdigo del mdulo del Ecuapass y estn relacionados a los buzones de correo de cada uno de los mdulos, mediante el emailSender.Los beans son los siguientes:

Para activar el notificador de error, en el mismo archivo XML donde est definido el JOB hay que realizar lo siguiente:1) Crear un bean que herede del bean skip listener del mdulo correspondiente. Se debe definir el atributo jobName

Para determinar el jobName se lo puede buscar en la tabla epcmm.ta_cmm_mntr_prcs con el siguiente SQL usando como parmetro el job idselect m.prcs_nm,m.*from epcmm.ta_cmm_mntr_prcs mwhere upper('jobDaeRegularizadaTerrestre') like '%'||upper(m.prcs_id)||'%';

2) Activar en el job el listener, colocando las entrada xml listeners y listener tal como se muestra en el ejemplo. Tambin es necesario que el step herede de stepWithSkippableAllException (prestar atencin a lo marcado en verde).

3) En la clase VO, que representa el tem que es procesado por las clases Processor o Writer, se debe sobrescribir el mtodo toString, para que muestre los datos de la clave primaria del tem que gener el error en el email.@Overridepublic String toString() {return "ExpDclfCommVO [cstm_cd=" + cstm_cd + ", yy=" + yy+ ", regm_cd=" + regm_cd + ", sn=" + sn + "]";}Casos especiales Se debe considerar que el notificador de errores no se debe activar en los batch que en su procesamiento lanzan errores explcitamente, es decir que tiene la sentencia throw en la codificacin de su Processor ni Writer, ya que estos errores se consideran normales en la aplicacin y por lo tanto no tienen sentido que se notifiquen al administrador del modulo.throw new Exception(); No se debe activar el comportamiento skip si en el writer se realizan transacciones internas. Porque en este caso Spring Batch siempre re ejecutar el writer para determinar en qu elemento de la coleccin genero el error, por lo tanto la transaccin interna se ejecutara 2 veces.Una transaccin interna se genera en los siguientes escenarios: Se crea una transaccin interna cuando se ejecuta un mtodo java con los prefijos newTrInsert*, newTrUpdate* y newTrDelete*, esto de acuerdo a lo que se encuentra configurado en el archivo /cdes_batch_svr/src/main/resources/spring/common/context-transaction.xml en las entradas XML con propagation="REQUIRES_NEW" Se crea una transaccin interna cuando se ejecuta un mtodo java que esta anotado de la siguiente manera@Transactional(value = "[NOMBRE]", propagation = Propagation.REQUIRES_NEW)