Filas e JMeter: compartilhando com Publicador e Assinante

Olá, Habr! Esta é uma continuação da minha publicação anterior, 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.

Filas e JMeter: compartilhando com Publicador e Assinante

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.

Filas e JMeter: compartilhando com Publicador e Assinante

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 recomenda 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 reivindicaçõesesse 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:

Filas e JMeter: compartilhando com Publicador e Assinante

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:

Filas e JMeter: compartilhando com Publicador e Assinante

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 um pedaço. Assinante final do JMS:

Filas e JMeter: compartilhando com Publicador e Assinante

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:

  1. Adicione um argumento JVM ao “iniciador” JMeter:
    -Dfile.encoding=UTF-8
  2. 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:

Filas e JMeter: compartilhando com Publicador e Assinante

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:

Filas e JMeter: compartilhando com Publicador e Assinante

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:

Filas e JMeter: compartilhando com Publicador e Assinante

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. aqui Definitivamente me contaram sobre isso.

Então eu tive que baixar código fonte e modificar código 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:

Filas e JMeter: compartilhando com Publicador e Assinante

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.

Filas e JMeter: compartilhando com Publicador e Assinante

Fonte: habr.com

Adicionar um comentário