Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Esta é uma POC com um cenário parcial do modelo final.

Configuração atual para canal de entrada com Spring Cloud Stream

Configuração da aplicação spring

...

Bloco de código
languagejava
themeMidnight
linenumberstrue
collapsetrue
@EnableBinding(Channel.class)
public class Subscriber {

	@StreamListener(target = Channel.INPUT, condition = Mensagem.CONDITIONAL_EXPRESSION)
	public void methodName(TOTVSMessage<Mensagem> message) {		
	}
}


Abaixo, exemplos concretos de um canal de entrada que correspondem as estruturas de código acima mencionadas:

Exemplo concreto da configuração, neste caso não há configuração para concurrency pois utiliza-se o valor padrão 1, também não é especificado a configuração referente a exchangeType pois o valor é topic (valor padrão).

...

Bloco de código
languagejava
themeMidnight
linenumberstrue
collapsetrue
@AllArgsConstructor
@EnableBinding(COLENTChannel.class)
public class ArquivoSubscriber {

	private final ArquivoApplicationService service;
	private final VerificarTenantValidoService verificarTenantValidoService;
	private final ArquivoRejeitadoApplicationService serviceRejeitada;

	@StreamListener(target = COLENTChannel.INPUT_NAME, condition = UploadArquivoCmd.CONDITIONAL_EXPRESSION)
	public void uploadArquivo(TOTVSMessage<UploadArquivoCmd> cmd) {
		if (verificarTenantValidoService.tenantValido(cmd)) {
			try {
				var cmd = ArquivoCmdAssembler.toCommand(message.getContent());
				service.handle(cmd);O canal de saída também podeO canal de saída também pode    } catch (Exception exception) {
				serviceRejeitada.handle(ArquivoCmdAssembler.toCommand(cmd, exception));
			}
		}
	}
}

Configuração atual de canal de saída com Spring Cloud Stream

Configuração da aplicação spring

...

Bloco de código
languagejava
themeMidnight
linenumberstrue
collapsetrue
@AllArgsConstructor
@EnableBinding(Channel.class)
public class Publisher {
	private Channel channel;
    private TransactionContext transactionContext;
	
	public <T> void publish(T message) {
		var messageName = event.getClass().getSimpleName();
		
		var message = new TOTVSMessage<T>( messageName, transactionContext.getTransactionInfo());
		message.setContent(message);
		message.sendTo(channel.output());
	}   
}


Abaixo, exemplos concretos de um canal de saída que correspondem as estruturas de código acima mencionadas:

Exemplo concreto da configuração, neste caso não há configuração para exchangeType pois o valor é topic (valor padrão).

...

Bloco de código
languagejava
themeMidnight
linenumberstrue
collapsetrue
@AllArgsConstructor
@EnableBinding(COLENTChannel.class)
public class Publisher {
	private COLENTPublisher channel;
    private TransactionContext transactionContext;
	
	public <T> void publish(T message) {
		var messageName = event.getClass().getSimpleName();
		
		var message = new TOTVSMessage<T>(messageName, transactionContext.getTransactionInfo());
		message.setContent(message);
		message.sendTo(channel.output());
	}   
}


Migrando o canal de entrada para SpringAMQP com formato de configuração customizado com TJF.

Configuração da aplicação spring 

...

Bloco de código
languagejava
themeMidnight
linenumberstrue
collapsetrue
@AllArgsConstructor
@Component
@RabbitListener(queues = QUEUE)
public class Subscriber {

	private static final QUEUE = "nomeFila"   

	@RabbitHandler  
    public void methodName(@Payload final Mensagem msg) {
	}
}

Abaixo, exemplos concretos de um canal de entrada que correspondem as estruturas de código acima mencionadas:

Exemplo concreto da configuração quando o tipo da exchange é topic.

...

Bloco de código
languagejava
themeMidnight
linenumberstrue
collapsetrue
@AllArgsConstructor 
@RabbitListener(queues = QUEUE) 
public class ArquivoSubscriber {
	private static final String QUEUE = "coleta-entrega-exchange.${spring.application.name}"

	private final ArquivoApplicationService service;
	private final VerificarTenantValidoService verificarTenantValidoService;
	private final ArquivoRejeitadoApplicationService serviceRejeitada;

	@RabbitListener
	public void uploadArquivo(@Payload UploadArquivoCmd cmd) {
		if (verificarTenantValidoService.tenantValido(cmd)) {
			try {
				var cmd = ArquivoCmdAssembler.toCommand(message.getContent());
				service.handle(cmd);
			} catch (Exception exception) {
				serviceRejeitada.handle(ArquivoCmdAssembler.toCommand(message, exception));
			}
		}
	}
}


Migrando o canal de saída para SpringAMQP com formato de configuração customizado com TJF.

Configuração da aplicação spring

...

Bloco de código
languagejava
themeMidnight
linenumberstrue
collapsetrue
@AllArgsConstructor
@Component
public class Publisher {
    private static final String EXCHANGE = "nomeExchange"

    private TransactionContext transactionContext;
	private RabbitTemplate rabbitTemplate;

    public <T> void publish(T message) {
		var messageName = event.getClass().getSimpleName();

	 	message = TOTVSMessageBuilder.<T>
					.withDefaultType()
					.setContent(message)
					.setTransactionInfo(transactionInfo)
					.buildAmqp();      

		rabbitTemplate.convertAndSend(EXCHANGE, null,   message , null); 
}

Abaixo, exemplos concretos de um canal de saída que correspondem as estruturas de código acima mencionadas:

Exemplo concreto da configuração quando o tipo da exchange é topic.

...