Pergunta

Eu estou tentando implementar testes de desempenho em ActiveMQ, assim que tem configuração um produtor básico e consumidores para enviar e receber mensagens através de uma fila. Eu criei um produtor sem problemas, ficando-lhe para escrever um determinado número de mensagens para a fila:

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

Esta continua a conclusão sem problemas e eu tenho confirmado isso com controlos no site do administrador, que tem o número correto de mensagens pendentes.

O problema ocorre quando tento receber as mensagens da fila. Usando um simples consumidor a ler a partir da fila, ele irá ler um vário número de mensagens da fila, mas depois vai parar ao tentar receber uma das mensagens. Eu posso ver que ainda existem mensagens na fila para ser lido, mas o cliente não vai progredir passou uma das mensagens. Eu estou usando um método simples para receber as mensagens:

Message message = jmsTemplate.receive();

e ele funciona para algumas mensagens (cerca de 20-30), mas depois é só encaixar. Foi-me sugerido que alguns dos caracteres na mensagem pode ser um caractere de escape (eu estava usando uma seqüência aleatória de comprimento variável, devido a este ser apenas um teste de desempenho, não realmente enviando sobre qualquer conteúdo) então eu mudei todas as mensagens para a mesma cadeia, que é uma repetição do char '2' e ainda não sorte. Eu estou usando configuração do Spring para carregar todos os componentes necessários para o acesso a fila ActiveMQ, e a fila está em execução no meu localhost.

Foi útil?

Solução

Não são muitos os pontos de vista sobre isso ainda, mas para referência futura, se alguém tem o mesmo problema, eu encontrei a solução. A configuração para activeMQ limita a quantidade de memória usada pelos emissores e receptores antes de abrandar-los, os valores padrão dadas a mim foram:

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

Tirei esta configuração completamente e agora ele funciona um sonho. Estou realizando testes de desempenho, de modo que você pode querer colocar suas próprias limitações, mas este foi definitivamente a causa dos meus problemas!

Outras dicas

É um problema clássico com mensagens; o que fazer com os consumidores lentas. Fwiw mais recentes lançamentos activemq como 5.2 permitem que você para fazer o spool para o disco ao invés de produtores de bloqueio quando a memória fica baixa

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top