Filas e JMeter: Exchange com Publicador e Assinante

Olá Habr!

Esta é uma sequência da minha publicação anterior , na qual falarei sobre as opções para colocar mensagens em filas usando o JMeter.

Fazemos um barramento de dados para uma grande empresa federal. Vários formatos de consulta, conversões, roteamento complexo. Para testar, você precisa enviar muitas mensagens na fila. Manualmente - uma dor que nem todo engenheiro manual vai lidar.



1. Introdução


Embora eu tenha que suportar essa dor no começo. Tudo começou com o RFHUtil. Poderoso, mas desconfortável e assustador: Bem, você conhece Rus.



Indispensável em alguns casos, mas caindo de forma estável em caso de uso ativo.
Testes convenientes com ele são impossíveis.

Com o JMeter, as coisas ficaram mais fáceis. Após o primeiro estágio de dominar e se acostumar, surgiu a esperança de um teste feliz.

Eu uso ativamente os samplers JMS Publisher e JMS Subscriber. Ao contrário do JMS ponto a ponto, esse casal parecia mais conveniente de se trabalhar. Por exemplo, você pode especificar uma variável para Assinante no Seletor JMS, para Ponto a Ponto - não (ou esse método não é muito óbvio).

Preparação do amostrador


Editor JMS


  • Instalação - cada amostra. O Apache recomenda usar 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? verdade. A IBM alega que o modo persistente fornece persistência confiável de mensagens no caso de uma falha repentina. E compartilhamento mais rápido no modo não persistente. Para fins de teste, a velocidade é mais importante.

Em cada Publicador, defino a propriedade jms que o Assinante usará no Seletor JMS. Para cada remessa, um valor aleatório é gerado no elemento do plano de teste Parâmetros do usuário:



Portanto, você pode ter certeza de que a mensagem correta foi lida.

O "espaço em branco" final do JMS Publisher pré-configurado:



Assinante Jms


  • Instalação - cada amostra. Bem, você entendeu.
  • Tempo limite (ms) = 100000. Se a solicitação não entrar na fila após 100 segundos de espera, ocorreu um erro.
  • Parar entre a amostra? verdade.


O JMS Selector é uma coisa bastante útil. Resumo Assinante JMS:



Como lidar com o alfabeto cirílico nas mensagens transmitidas. No JMeter, por padrão, após a subtração, ele é exibido de forma torta. Para evitar isso e aproveitar os grandes e poderosos sempre e em qualquer lugar, você precisa:

  1. Inclua o argumento da JVM no "iniciador" do JMeter:
    -Dfile.encoding=UTF-8 
  2. Adicione o PostProcessor JSR223 ao Assinante com uma linha no groovy:
     prev.setDataEncoding("UTF-8") 

Transferência de texto


A opção mais preguiçosa. Adequado para depurar testes escritos recentemente. Ou nos casos em que você precisa enviar pelo menos algo pequeno. Selecione a opção Origem da mensagem - Área de texto 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 Origem da mensagem - do arquivo e especifique o caminho para a mensagem no campo Arquivo - Nome do arquivo:



Transferir arquivo para o campo de texto


A opção mais versátil. Adequado para a maioria dos cenários +, pode ser usado no JMS ponto a ponto, no qual não há segunda opção de envio:



Transferência de matriz de bytes


A opção mais difícil. Adequado para verificar a transferência infalivelmente precisa de solicitações para o byte, sem distorção, SMS e perturbação. Não posso fazer isso no JMeter padrão, aqui eles definitivamente me falaram sobre isso.

Portanto, tive que baixar as fontes e modificar o código do assinante JMS.

Substituiu a linha no método extractContent(..) :

 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.

Resta adicionar um par de JSR223 Sampler. O primeiro é antes do par Publicador / Assinante para 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:\\temp\\randomBytes.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"); } 

O segundo, 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 esqueça de adicionar o caminho para o arquivo do Publisher:



E também verifique a JSR223 Assertion for Subscriber - compare os bytes de origem com os que entram 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


Ele descreveu quatro maneiras de enviar mensagens em uma fila, que eu uso na prática todos os dias. Espero que esta informação facilite sua vida. Na sequência, pretendo falar sobre minha experiência em testar trocas, onde, por um lado, está a fila e, por outro, o banco de dados ou sistema de arquivos.

Cuide do seu tempo. E obrigado por assistir.

imagem

Source: https://habr.com/ru/post/pt446536/


All Articles