Lote de Primavera - Nem todos os registros estão sendo processados a partir da recuperação do MQ
Sou bastante novo no Spring e no Spring Batch, portanto, fique à vontade para fazer qualquer pergunta esclarecedora, se houver.
Estou com um problema no Spring Batch que não consigo recriar em nossos ambientes locais de teste ou local. Temos uma tarefa diária que se conecta ao Websphere MQ via JMS e recupera um conjunto de registros. Este trabalho usa o JMS ItemReader pronto para uso. Implementamos nosso próprio ItemProcessor, mas ele não faz nada de especial além do log. Não há filtros ou processamento que devam afetar os registros recebidos.
O problema é que, dos mais de 10.000 registros diários no MQ, apenas cerca de 700 ou mais (o número exato é diferente a cada vez) geralmente são registrados no ItemProcessor. Todos os registros são retirados com êxito da fila. O número de registros registrados é diferente a cada vez e parece não ter um padrão. Comparando os arquivos de log com a lista de registros no MQ, podemos ver que um subconjunto aparentemente aleatório de registros está sendo "processado" pelo nosso trabalho. O primeiro registro pode ser selecionado, 50 são ignorados, 5 são seguidos, etc. E o padrão é diferente cada vez que o trabalho é executado. Nenhuma exceção também é registrada.
Ao executar o mesmo aplicativo no host local e testar usando o mesmo conjunto de dados, todos os mais de 10.000 registros são recuperados e registrados com êxito pelo ItemProcessor. O trabalho é executado entre 20 e 40 segundos em Produção (também não constante), mas nos locais de teste e leva alguns minutos para ser concluído (o que obviamente faz sentido, pois está lidando com muitos mais registros).
Portanto, esse é um dos problemas difíceis de solucionar, pois não podemos recriá-lo. Uma idéia é implementar nosso próprio ItemReader e adicionar log adicional para que possamos ver se os registros estão sendo perdidos antes ou depois do leitor - tudo o que sabemos agora é que apenas um subconjunto de registros está sendo tratado pelo ItemProcessor. Mas mesmo isso não resolverá o nosso problema e será um pouco oportuno para implementar, considerando que nem sequer é uma solução.
Alguém já viu um problema como este? Todas as idéias possíveis ou sugestões para solução de problemas serão muito apreciadas. Aqui estão alguns dos números de versão do jar que estamos usando como referência.
Primavera - 3.0.5.Integração com a Primavera - 2.0.3.RELEASELote de molas - 2.1.7.RELEASEMQ ativo - 5.4.2Websphere MQ - 7.0.1Agradecemos antecipadamente a sua contribuição.
EDIT: Por solicitação, código do processador:
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;
}
Configuração 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>