Вы находитесь на странице: 1из 5

Activar el comportamiento Skip en los batch

El 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 skip
El step stepWithSkippableAllException se 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 atencin 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 configuracin 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>
</chunk>
<transaction-attributes isolation="READ_COMMITTED" propagation="REQUIRED"/>
</tasklet>
<next on="COMPLETED" to="stepBaBtBnddTrspDclActtJobCompleted"/>
<next on="FAILED" to="stepBaBtBnddTrspDclActtJobFailed"/>
</step>
<step id="stepBaBtBnddTrspDclActtJobCompleted">
<tasklet ref="ecuaPassCompletedTasklet" transaction-manager="transactionManager">
</tasklet>
</step>
<step id="stepBaBtBnddTrspDclActtJobFailed">
<tasklet ref="baBtBnddTrspDclActtFailedTasklet" transaction-manager="transactionManager">
</tasklet>
</step>
</job>
A esto (Quitando lo marcado en rojo y aadiendo lo que est marcado en verde)
<job id="BaBtBnddTrspDclActtJob">
<step id="stepBaBtBnddTrspDclActtJob" parent="stepWithSkippableAllException">
<tasklet>
<chunk reader="baBtBnddTrspDclActtReader"
writer="baBtBnddTrspDclActtWriter"
commit-interval="1" >
</chunk>
<transaction-attributes isolation="READ_COMMITTED" propagation="REQUIRED"/>
</tasklet>
<next on="COMPLETED" to="stepBaBtBnddTrspDclActtJobCompleted"/>
<next on="FAILED" to="stepBaBtBnddTrspDclActtJobFailed"/>
</step>
<step id="stepBaBtBnddTrspDclActtJobCompleted">
<tasklet ref="ecuaPassCompletedTasklet" transaction-manager="transactionManager">
</tasklet>
</step>
<step id="stepBaBtBnddTrspDclActtJobFailed">
<tasklet ref="baBtBnddTrspDclActtFailedTasklet" transaction-manager="transactionManager">
</tasklet>
</step>
</job>
Activar notificador va email de un evento skip
Con 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.
<bean id="abstractSkipListener"
class="ec.gob.aduana.ecuapass.bat.cmm.listener.SkipListener"
abstract="true">
</bean>

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:

<bean id="skipListenerDbk"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderDbk"/>
<property name="emailTitle" value="Error en batch de Drawback"/>
</bean>

<bean id="skipListenerEcg"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderEcg"/>
<property name="emailTitle" value="Error en batch de Carga de Exportacin"/>
</bean>

<bean id="skipListenerEcl"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderEcl"/>
<property name="emailTitle" value="Error en batch de Despacho de Exportacin"/>
</bean>

<bean id="skipListenerEnc"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderEnc"/>
<property name="emailTitle" value="Error en batch de Nota de Credito"/>
</bean>

<bean id="skipListenerIcg"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderIcg"/>
<property name="emailTitle" value="Error en batch de Carga de Importacin"/>
</bean>

<bean id="skipListenerIcl"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderIcl"/>
<property name="emailTitle" value="Error en batch de Despacho de Importacin"/>
</bean>

<bean id="skipListenerInp"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderInp"/>
<property name="emailTitle" value="Error en batch de Portal Interno"/>
</bean>

<bean id="skipListenerIpt"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderIpt"/>
<property name="emailTitle" value="Error en batch de Portal Externo"/>
</bean>

<bean id="skipListenerPct"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderPct"/>
<property name="emailTitle" value="Error en batch de Control Posterior"/>
</bean>

<bean id="skipListenerRmg"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderRmg"/>
<property name="emailTitle" value="Error en batch de Gestin de Riesgos"/>
</bean>

<bean id="skipListenerVmg"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderVmg"/>
<property name="emailTitle" value="Error en batch de Base de Valor"/>
</bean>

<bean id="skipListenerVue"
parent="abstractSkipListener">
<property name="emailSender" ref="emailSenderVue"/>
<property name="emailTitle" value="Error en batch de VUE"/>
</bean>


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
<beans:bean id="daeRegularizadaTerrestreSkipListenerEcl" parent="skipListenerEcl">
<beans:property name="jobName" value="Regularizacin de DAEs de transporte terrestre"/>
</beans:bean>

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 id
select m.prcs_nm,m.*
from epcmm.ta_cmm_mntr_prcs m
where 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).
<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"/>
<listeners>
<listener ref="daeRegularizadaTerrestreSkipListenerEcl"/>
</listeners>
</step>
<step id="stepJobDaeRegularizadaTerrestreCompleted">
<tasklet ref="ecuaPassCompletedTasklet" transaction-manager="transactionManager">
</tasklet>
</step>
<step id="stepJobDaeRegularizadaTerrestreFailed">
<tasklet ref="ecuaPassECLfailedTasklet" transaction-manager="transactionManager">
</tasklet>
</step>
</job>
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.
@Override
public 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:
o 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"
o 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)

Вам также может понравиться