Olá, Habr! Esta é uma continuação da minha , onde falarei sobre opções para colocar mensagens em filas usando JMeter.
Estamos fazendo um barramento de dados para uma grande empresa federal. Vários formatos de solicitação, transformações, roteamento complexo. Para testar, você precisa enviar muitas mensagens para a fila. Manualmente é uma dor que nem todo quiroprático consegue suportar.

Introdução
Embora eu tenha tido que aguentar essa dor no início. Tudo começou com RFHUtil. Poderoso, mas estranho e assustador: bem, você conhece Rus.

Indispensável em alguns casos, mas diminuindo constantemente em caso de uso ativo.
Testes convenientes são impossíveis com isso.
Com o JMeter tudo ficou mais fácil. Após a primeira fase de domínio e habituação, começou a surgir a esperança de um teste feliz.
Eu uso ativamente os amostradores JMS Publisher e JMS Subscriber. Ao contrário do JMS Point-to-Point, este par parecia mais conveniente de usar. Por exemplo, com Subscriber no JMS Selector você pode especificar uma variável, mas com Point-to-Point você não pode (ou este método não é muito óbvio).
Preparando amostradores
Editora JMS
- Configuração - Cada amostra. Apache use esta opção se filas/tópicos forem especificados por meio de variáveis.
- Expiração (ms) = 120000. Em caso de falha, as solicitações de teste desaparecerão da fila após 2 minutos.
- Usar modo de entrega não persistente? - verdadeiro. IBM esse modo persistente garante a preservação confiável das mensagens transmitidas no caso de uma falha repentina. E troca mais rápida em modo não persistente. Para fins de teste, a velocidade é mais importante.
Em cada Publisher defino uma propriedade jms que o Assinante utilizará no Seletor JMS. Para cada envio, um valor aleatório é gerado no elemento do plano de testes Parâmetros do Usuário:

Dessa forma, você pode ter certeza de que a mensagem correta será lida.
O “espaço em branco” final de um JMS Publisher pré-configurado:

Assinante JMS
- Configuração - Cada amostra. Bem, você entende.
- Tempo limite (ms) = 100000. Se a solicitação não chegar na fila após 100 segundos de espera, algo deu errado.
- Parar entre amostras? - verdadeiro.
Seletor JMS - bastante conveniente . Assinante final do JMS:

Como lidar com o alfabeto cirílico nas mensagens transmitidas. No JMeter, por padrão, após a revisão, ele é exibido torto. Para evitar isso e aproveitar o que é grande e poderoso sempre e em qualquer lugar, você precisa:
- Adicione um argumento JVM ao “iniciador” JMeter:
-Dfile.encoding=UTF-8 - Adicione JSR223 PostProcessor ao Assinante com linha bacana:
prev.setDataEncoding("UTF-8")
Mande mensagem
A opção mais preguiçosa. Adequado para depurar testes recém-escritos. Ou para os casos em que você precisa enviar pelo menos algo pequeno. Selecione a opção Fonte da mensagem – Textarea e coloque o corpo da mensagem em um bloco de texto:

Transferência de arquivos
A opção mais comum. Adequado para a maioria dos cenários. Selecione a opção Fonte da mensagem – Do arquivo e indique o caminho para a mensagem no campo Arquivo - Nome do arquivo:

Transferindo um arquivo para um campo de texto
A opção mais versátil. Adequado para a maioria dos cenários + pode ser usado em JMS Ponto a Ponto onde não há segunda opção de envio:

Passando uma matriz de bytes
A opção mais difícil. Adequado para verificar a transmissão infalivelmente precisa de solicitações até o byte, sem distorção, SMS e perturbação. Você não poderá fazer isso no JMeter padrão. Definitivamente me contaram sobre isso.
Então eu tive que baixar e modificar Assinante JMS.
Substituído no método extractContent(..) linha:
buffer.append(bytesMessage.getBodyLength() + " bytes received in BytesMessage");em:
byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
bytesMessage.readBytes(bytes);
try {
buffer.append(new String(bytes, "UTF-8"));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}e reconstruiu o JMeter.
Tudo o que resta é adicionar alguns amostradores JSR223. A primeira é antes do par Editor/Assinante criar um arquivo DAT contendo bytes aleatórios:
import org.apache.commons.lang3.RandomUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
vars.put("PATH_TO_BYTES", "C:temprandomBytes.dat");
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
byte[] arr = RandomUtils.nextBytes((int)(Math.random()*10000));
try {
FileOutputStream fos = new FileOutputStream(RESULT_FILE);
fos.write(arr);
fos.close();
} catch (IOException e) {
System.out.println("file not found");
}A segunda - no final do script, exclui o arquivo:
import java.io.File;
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
RESULT_FILE.delete();E não se esqueça de adicionar o caminho do arquivo no Publisher:

E também uma verificação na Asserção JSR223 para Assinante - compare os bytes de origem com os que chegam na fila do destinatário:
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
Path path = Paths.get(vars.get("PATH_TO_BYTES"), new String[0]);
byte[] originalArray = Files.readAllBytes(path);
byte[] changedArray = ctx.getPreviousResult().getResponseData();
System.out.println(changedArray.length);
if (Arrays.equals(originalArray, changedArray))
{
SampleResult.setResponseMessage("OK");
} else {
SampleResult.setSuccessful(false);
SampleResult.setResponseMessage("Comparison failed");
SampleResult.setResponseData("Bytes have changed","UTF-8");
IsSuccess=false;
}Conclusão
Descrevi quatro maneiras de enviar mensagens para filas, que uso todos os dias na prática. Espero que essas informações facilitem sua vida. Na continuação, pretendo falar sobre minha experiência testando uma exchange onde há uma fila em uma extremidade e um banco de dados ou sistema de arquivos na outra.
Economize seu tempo. E obrigado pela sua atenção.

Fonte: habr.com
