Spring Batch - Nicht alle Datensätze werden vom MQ-Abruf verarbeitet.

Ich bin ziemlich neu in Spring und Spring Batch, also zögern Sie nicht, irgendwelche klärenden Fragen zu stellen, wenn Sie welche haben.

Ich sehe ein Problem mit Spring Batch, das ich in unseren Test- oder lokalen Umgebungen nicht wiederherstellen kann. Wir haben einen täglichen Job, der über JMS eine Verbindung zu Websphere MQ herstellt und eine Reihe von Datensätzen abruft. Dieser Job verwendet den sofort einsatzbereiten JMS ItemReader. Wir implementieren unseren eigenen ItemProcessor, der jedoch nichts Besonderes außer Protokollieren tut. Es gibt keine Filter oder Verarbeitungen, die sich auf eingehende Datensätze auswirken könnten.

Das Problem ist, dass von den über 10.000 täglichen Datensätzen in MQ in der Regel nur etwa 700 (die genaue Anzahl ist jedes Mal anders) im ItemProcessor protokolliert werden. Alle Datensätze wurden erfolgreich aus der Warteschlange gezogen. Die Anzahl der protokollierten Datensätze ist jedes Mal anders und scheint kein Muster zu haben. Durch Vergleichen der Protokolldateien mit der Liste der Datensätze in MQ können wir feststellen, dass eine scheinbar zufällige Teilmenge der Datensätze von unserem Job "verarbeitet" wird. Der erste Datensatz wird möglicherweise abgerufen, dann werden 50 übersprungen, dann 5 nacheinander usw. Und das Muster ist bei jeder Ausführung des Jobs anders. Es werden auch keine Ausnahmen protokolliert.

Wenn dieselbe App in localhost ausgeführt und mit demselben Datensatz getestet wird, werden alle Datensätze über 10.000 erfolgreich vom ItemProcessor abgerufen und protokolliert. Der Job wird in der Produktion zwischen 20 und 40 Sekunden ausgeführt (ebenfalls nicht konstant), aber im Test und vor Ort dauert der Abschluss einige Minuten (was offensichtlich Sinn macht, da so viele weitere Datensätze verarbeitet werden).

So ist dies eines der schwierigsten Probleme, da wir es nicht neu erstellen können. Eine Idee ist, unseren eigenen ItemReader zu implementieren und zusätzliche Protokollierung hinzuzufügen, damit wir sehen können, ob Datensätze vor oder nach dem Reader verloren gehen. Wir wissen nur, dass nur eine Teilmenge der Datensätze vom ItemProcessor verarbeitet wird. Aber auch das wird unser Problem nicht lösen, und es wird etwas zeitgemäßer sein, es zu implementieren, da es nicht einmal eine Lösung ist.

Hat jemand ein Problem wie dieses gesehen? Alle möglichen Ideen oder Vorschläge zur Fehlerbehebung wären sehr dankbar. Hier sind einige der JAR-Versionsnummern, die wir als Referenz verwenden.

Spring - 3.0.5.RELEASESpring Integration - 2.0.3.RELEASESpring Batch - 2.1.7.RELEASEActive MQ - 5.4.2Websphere MQ - 7.0.1

Vielen Dank im Voraus für Ihre Eingabe.

EDIT: Auf Anfrage Code für Bearbeiter:

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;
}

JMS config:

<?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>

Antworten auf die Frage(4)

Ihre Antwort auf die Frage