Domanda

Sto cercando di implementare il test delle prestazioni su ActiveMQ, quindi ho impostato un produttore e un consumatore di base per inviare e ricevere messaggi attraverso una coda. Ho creato un produttore senza problemi, facendolo scrivere un numero specifico di messaggi in coda:

 for(int i = 0; i < numberOfMessages; i++){
                try{
                    String message = generateText(sizeOfMessage);
                    produceMessage(message);
                }
                catch (Exception e) {
                    logger.error("Caught exception while sending message", e);
                }
            }

Questo continua fino al completamento senza problemi e l'ho confermato con controlli sul sito Web di amministrazione, che hanno il numero corretto di messaggi in sospeso.

Il problema si verifica quando provo a ricevere i messaggi dalla coda. Utilizzando un semplice consumatore per leggere dalla coda, leggerà un numero diverso di messaggi dalla coda, ma poi si fermerà quando si tenta di ricevere uno dei messaggi. Vedo che ci sono ancora messaggi nella coda da leggere, ma il client non avanzerà oltre uno dei messaggi. Sto usando un metodo semplice per ricevere i messaggi:

Message message = jmsTemplate.receive();

e funziona per alcuni messaggi (circa 20-30) ma poi si blocca. Mi è stato suggerito che alcuni dei caratteri nel messaggio potrebbero essere un carattere di escape (stavo usando una stringa casuale di lunghezza variabile, a causa del fatto che si trattava solo di un test delle prestazioni, non di invio su alcun contenuto), quindi ho cambiato tutti i messaggi alla stessa stringa, che è una ripetizione del carattere '2' e ancora nessuna fortuna. Sto usando la configurazione di Spring per caricare tutti i componenti necessari per accedere alla coda ActiveMQ e la coda è in esecuzione sul mio localhost.

È stato utile?

Soluzione

Non ci sono ancora molte opinioni su questo, ma per riferimento futuro se qualcuno ha lo stesso problema, ho trovato la soluzione. La configurazione per activeMQ limita la quantità di memoria utilizzata dai mittenti e dai destinatari prima di rallentarli, i valori predefiniti forniti sono:

<systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="20 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb" name="foo"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

Ho rimosso completamente questa configurazione e ora funziona un sogno. Sto eseguendo test delle prestazioni, quindi potresti voler mettere i tuoi limiti, ma questa è stata sicuramente la causa dei miei problemi!

Altri suggerimenti

È un classico problema con la messaggistica; cosa fare con i consumatori lenti. FWIW le versioni più recenti di ActiveMQ come 5.2 consentono di eseguire lo spooling su disco anziché bloccare i produttori quando la memoria si sta esaurendo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top