Produtor JMS simples versus multiencadeado
Eu queria ver quanta diferença de tempo faria com o uso de um produtor multithread em vez de um único thread thread. Eu configurei um ActiveMQ na minha máquina local, escrevi uma classe de produtor que inicializaria e iniciaria uma conexão JMS em seu construtor. Defino o limite de mensagens para 3M e demorou cerca de 50 segundos para enviar todas as mensagens para o ActiveMQ. Enviei apenas uma sequência de "olá mundo" 3M vezes.
Em seguida, usei o mesmo objeto produtor (uma conexão, mas várias sessões) e o executei com um ExecutorService de tamanho de segmento oito. Norun
método, eu dividiria 3M por 8 apenas para garantir que cada thread não envie mais que 375000 mensagens. Demorou cerca de 60 segundos para enviar todas as mensagens neste caso.
ExecutorService service = Executors.newFixedThreadPool(8);
for (int i = 0; i < 8; i++) {
service.execute(producer);
}
Em seguida, criei oito produtores, cada um com sua própria conexão e os executei com o ExecutorService ou com o tamanho oito. Desta vez, demorou cerca de 68 segundos para enviar todas as mensagens da 3M.
for (int i = 0; i < 8; i++) {
service.execute(new Producer());
}
Estou me perguntando, por que um único produtor de threads apresentaria melhor desempenho aqui? Eu executei cada cenário cerca de 10 vezes, mas os resultados permaneceram os mesmos.