Spring Batch: no todos los registros se están procesando desde la recuperación de MQ
Soy bastante nuevo en Spring and Spring Batch, así que siéntase libre de hacer cualquier pregunta aclaratoria si tiene alguna.
Veo un problema con Spring Batch que no puedo recrear en nuestros entornos de prueba o locales. Tenemos un trabajo diario que se conecta a Websphere MQ a través de JMS y recupera un conjunto de registros. Este trabajo utiliza el elemento JMS ItemReader listo para usar. Implementamos nuestro propio ItemProcessor, pero no hace nada especial aparte del registro. No hay filtros ni procesos que puedan afectar los registros entrantes.
El problema es que de los más de 10,000 registros diarios en MQ, solo alrededor de 700 (el número exacto es diferente cada vez) generalmente se registran en el ItemProcessor. Todos los registros se extraen correctamente de la cola. El número de registros registrados es diferente cada vez y parece no tener patrón. Al comparar los archivos de registro con la lista de registros en MQ, podemos ver que nuestro trabajo está "procesando" un subconjunto de registros aparentemente aleatorio. El primer registro puede ser recogido, luego se omiten 50, luego 5 seguidos, etc. Y el patrón es diferente cada vez que se ejecuta el trabajo. No se registran excepciones tampoco.
Al ejecutar la misma aplicación en localhost y probar usando el mismo conjunto de datos, el ItemProcessor recupera y registra con éxito todos los más de 10,000 registros. El trabajo se ejecuta entre 20 y 40 segundos en Producción (también no constante), pero en prueba y local tarda varios minutos en completarse (lo que obviamente tiene sentido ya que maneja muchos más registros).
Así que este es uno de esos problemas difíciles de solucionar, ya que no podemos recrearlo. Una idea es implementar nuestro propio ItemReader y agregar registros adicionales para que podamos ver si los registros se pierden antes o después del lector; todo lo que sabemos ahora es que solo un subconjunto de registros está siendo manejado por el ItemProcessor. Pero incluso eso no resolverá nuestro problema, y será algo oportuno implementarlo considerando que ni siquiera es una solución.
¿Alguien más ha visto un problema como este? Cualquier idea posible o sugerencia de solución de problemas sería muy apreciada. Estos son algunos de los números de versión de jar que estamos utilizando como referencia.
Primavera - 3.0.5. LIBERACIÓNIntegración de Spring - 2.0.3.Spring Batch - 2.1.7. LIBERACIÓNActive MQ - 5.4.2Websphere MQ - 7.0.1Gracias de antemano por sus comentarios.
EDITAR: Por solicitud, código para el procesador:
public SMSReminderRow process(Message message) throws Exception {
SMSReminderRow retVal = new SMSReminderRow();
LOGGER.debug("Converting JMS Message to ClaimNotification");
ClaimNotification notification = createClaimNotificationFromMessage(message);
retVal.setShortCode(BatchCommonUtils
.parseShortCodeFromCorpEntCode(notification.getCorpEntCode()));
retVal.setUuid(UUID.randomUUID().toString());
retVal.setPhoneNumber(notification.getPhoneNumber());
retVal.setMessageType(EventCode.SMS_CLAIMS_NOTIFY.toString());
DCRContent content = tsContentHelper.getTSContent(Calendar
.getInstance().getTime(),
BatchCommonConstants.TS_TAG_CLAIMS_NOTIFY,
BatchCommonConstants.TS_TAG_SMSTEXT_TYP);
String claimsNotificationMessage = formatMessageToSend(content.getContent(),
notification.getCorpEntCode());
retVal.setMessageToSend(claimsNotificationMessage);
retVal.setDateTimeToSend(TimeUtils
.getGMTDateTimeStringForDate(new Date()));
LOGGER.debug(
"Finished processing claim notification for {}. Writing row to file.",
notification.getPhoneNumber());
return retVal;
}
Configuración JMS:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="claimsQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jms/SMSClaimNotificationCF" />
<property name="lookupOnStartup" value="true" />
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.jms.ConnectionFactory" />
</bean>
<bean id="jmsDestinationResolver"
class="org.springframework.jms.support.destination.DynamicDestinationResolver">
</bean>
<bean id="jmsJndiDestResolver"
class=" org.springframework.jms.support.destination.JndiDestinationResolver"/>
<bean id="claimsJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="claimsQueueConnectionFactory" />
<property name="defaultDestinationName" value="jms/SMSClaimNotificationQueue" />
<property name="destinationResolver" ref="jmsJndiDestResolver" />
<property name="pubSubDomain">
<value>false</value>
</property>
<property name="receiveTimeout">
<value>20000</value>
</property>
</bean>