Introdução


A comunicação entre os componentes Storex é realizada através de framework proprietário que consiste na criação de Mensagens (armazena as informações que serão trafegadas) e Tratadores (definem as regras de negócio para os dados trafegados nas mensagens).

Arquitetura


Biblioteca Linx-messaging

Responsável por implementar engenho de comunicação entre os componentes do Storex. Por essa razão, esta biblioteca está incluída em todos as aplicações: Storex-EP, Storex-SP, Storex-PDV e Storex-Integrador-Transasoes. Em termos de API para desenvolvimento, define duas classes importantes destacadas abaixo:

  • Request: Mensagem de requisição recebida pelos sistemas e redirecionada para o seu respectivo tratador. Deve conter todos os dados necessários para o processamento da requisição.

  • Response: Mensagem com os dados de retorno do tratador.


Instruções com exemplo para criação de Tratadores e Mensagens


Nesta seção será mostrado um passo a passo (com exemplos) das ações necessárias para criação e configuração de novas mensagens e tratados no Storex Custom.

O exemplo abaixo consiste de uma ação didática com objetivo de enviar a mensagem contendo o texto 'LINX' e receber como resposta a mensagem invertida ('XNIL').


Passo 1. Criação das Mensagens


Deve ser criada a classe que representa a mensagem de Requisição, no caso deve implementar a interface Request explicada anteriormente.

No exemplo ao lado, a classe MinhaRequisicaoCustom.java implementa a interface Request e possui apenas um atributo, chamado originalText, que será utilizado para enviar o texto original da requisição ao tratador











Da mesma forma, deve ser criada a classe que representa a mensagem de retorno.

A classe MinhaRespostaCustom.java implementa a interface Response e possui apenas um atributo, chamado modifiedText, que será responsável por retornar o texto modificado pelo tratador.












Uma informação importante na criação das mensagens é que a sua organização deve respeitar o contexto e módulo em que está inserida. Nos exemplos acima, é possível inferir algumas informações a partir do pacote onde as classes foram inseridas. Logo,

É indicado criar subpacotes por módulo, de forma que a organização das mensagens seja ainda mais intuitiva, de forma que contextos como vendas, consultas de produtos ou solicitação de dados da loja ou operador, por exemplo, sejam fáceis de serem encontrados.

MinhaRequisicaoCustom
package com.linx.custom.messages.pos.request;

import com.linx.messaging.Request;

public class MinhaRequisicaoCustom implements Request {

	private String originalText;
	
	public String getOriginalText() {
		return originalText;
	}
	
	public void setOriginalText(String originalText) {
		this.originalText = originalText;
	}
}


MinhaRespostaCustom
package com.linx.custom.messages.pos.response;

import com.linx.messaging.Response;

public class MinhaRespostaCustom implements Response {
	
	private String modifiedText;

	public String getModifiedText() {
		return modifiedText;
	}

	public void setModifiedText(String modifiedText) {
		this.modifiedText = modifiedText;
	}
}



Passo 2. Criação dos Tratadores


Os tratadores são classes responsáveis por receber e processar as informações contidas nas mensagens. Novos tratadores devem ser criados implementando a interface SyncListener<Request, Response>, contido também na biblioteca linx-messaging. 

No exemplo ao lado, foi criada a classe MeuTratadorCustom.java que utiliza as mensagens criadas na seção anterior para receber um texto e devolvê-lo com as letras invertidas.

Por implementar a interface SyncListener<Request, Response>, observe que devem ser declaradas as mensagens de requisição e retorno na declaração da classe e deve ser sobrescrito execute() que efetivamente realiza o processamento desejado com os dados da mensagem.

Assim como explicado na seção das mensagens, a criação das classes tratadoras também deve seguir uma organização e distribuição que respeite o seu contexto, módulo e localização dentro da solução.

Logo, verificando o pacote da classe MeuTratadorCustom.java -(com.linx.custom.listener.pos), pode-se manter a organização:

  1. linx - Faz parte de uma solução Linx
  2. custom - É uma classe customizada
  3. listener - Trata-se de um listener (tratador)
  4. pos - Diz respeito ao módulo POS



MeuTratadorCustom
package com.linx.custom.listeners.pos;

import com.linx.custom.messages.pos.request.MinhaRequisicaoCustom;
import com.linx.custom.messages.pos.response.MinhaRespostaCustom;
import com.linx.messaging.MessagingException;
import com.linx.messaging.SyncListener;

public class MeuTratadorCustom implements SyncListener<MinhaRequisicaoCustom, MinhaRespostaCustom> {

	@Override
	public MinhaRespostaCustom execute(MinhaRequisicaoCustom message) throws MessagingException {
		MinhaRespostaCustom response = new MinhaRespostaCustom();
		StringBuilder sb = new StringBuilder(message.getOriginalText());
		sb.reverse();
		response.setModifiedText(sb.toString());
		return response;
	}
}


Passo 3. Configuração dos Tratadores/Mensagens no Storex


Após a criação dos tratadores, o próximo passo é associá-los ao sistema desejado. Nesse caso, é possível fazer isso sem mexer nas classes inicializadoras das aplicações, apenas manipulando um arquivo de configuração que está disponível em cada aplicação.


Trata-se do arquivo MessageListeners.xml, que possui uma lista de SyncMessageInfo a serem carregados dinamicamente.

Tudo o que você precisa é adicionar a classe de requisição e o seu respectivo tratador entre os itens listados. Na imagem ao lado está formato inicial do arquivo que possui trecho no início com todas as instruções necessárias para a adição de novos itens no arquivo.


A localização do arquivo varia de projeto para projeto, conforme observado abaixo. É necessário estar atento para inserir as informações no artefato correto.

storex-ep: linx-storex-ep-standard/src/main/resources/tratadores/MessageListeners.xml

storex-sp: linx-storex-sp/src/main/resources/tratadores/MessageListeners.xml

pos-standard: linx-storex-pos-standard/src/main/resources/configuracao/tratadores/MessageListeners.xml

storex-int-trans: linx-storex-int-transacoes/src/main/resources/tratadores/MessageListeners.xml




O arquivo MessageListeners.xml é embarcado no pacote *.jar gerado para o módulo, conforme observado na imagem abaixo:










Seguindo nosso exemplo, é necessário adicionar as classes MinhaRequisicaoCustom.java e MeuTratadorCustom.java como um novo SyncMessageInfo no arquivo, tomando o cuidado de adicionar não apenas o nome da classe, mas o path completo (pacote + nome):









MessageListeners.XML
<!-- Este documento contém uma lista de mensagens e seus respectivos tratadores, os 
     quais serão carregados durante a abertura do sistema. Para adicionar novos itens, 
	 favor seguir o modelo abaixo, onde SyncMessageInfo se refere a um novo item da 
	 lista, que contem, respectivamente, os atributos messageClassName, que representa 
	 a mensagem, e listenerClassName, referente ao tratador. Para ambos, é necessário 
	 informar o caminho completo da classe, ou seja, pacote + nome da classe.
-->
<SynMessageInfoList>
  <!-- No exemplo abaixo, a classe MensagemCustomizada está contida em {$sistema}/bin/com/linx/messages e se refere à
       mensagem recebida pelo sistema. Já a classe TratadorCustomizado está contida em {$sistema}/bin/com/linx/tratadores
	   e se refere ao tratador que será disparado ao receber a mensagem do tipo MensagemCustomizada.
  <SyncMessageInfo>
    <messageClassName>com.linx.messages.MensagemCustomizada</messageClassName>
    <listenerClassName>com.linx.tratadores.TratadorCustomizado</listenerClassName>
  </SyncMessageInfo>  
  -->
</SynMessageInfoList>



MessageListeners.XML
<SynMessageInfoList>
  <SyncMessageInfo>
    <messageClassName>com.linx.custom.messages.pos.request.MinhaRequisicaoCustom</messageClassName>
    <listenerClassName>com.linx.custom.listeners.pos.MeuTratadorCustom</listenerClassName>
  </SyncMessageInfo>
</SynMessageInfoList>


  • Sem rótulos