Cadeia Apache Commons
1. Introdução
Apache Commons Chain é uma biblioteca que usa a Cadeia de Responsabilidadepattern - geralmente usada para organizar fluxos de processamento complexos nos quais vários receptores podem processar uma solicitação.
Neste artigo rápido, veremos um exemplo que representa um saque em um caixa eletrônico.
2. Dependência do Maven
Para começar, importaremos a versão mais recente desta biblioteca usando o Maven:
commons-chain
commons-chain
1.2
Para verificar a versão mais recente desta biblioteca -go here.
3. Cadeia de exemplo
O caixa eletrônico pega um número como entrada e o transmite aos manipuladores responsáveis por executar ações diferentes. Isso envolve o cálculo do número de notas a serem distribuídas e o envio de uma notificação ao banco e ao cliente sobre a transação.
4. Contexto da Cadeia
O contexto representa o estado atual de um aplicativo, armazenando informações sobre a transação.
Para nossa solicitação de retirada de caixas eletrônicos, as informações de que precisamos são:
-
Montante total a retirar
-
Número de 100 notas de denominação
-
Número de 50 notas de denominação
-
Número de 10 notas de denominação
-
Valor restante a ser retirado
Este estado é definido em uma classe:
public class AtmRequestContext extends ContextBase {
int totalAmountToBeWithdrawn;
int noOfHundredsDispensed;
int noOfFiftiesDispensed;
int noOfTensDispensed;
int amountLeftToBeWithdrawn;
// standard setters & getters
}
5. Comando
OCommand pegaContext como uma entrada e o processa.
Implementaremos cada uma das etapas mencionadas acima como umCommand:
public class HundredDenominationDispenser implements Command {
@Override
public boolean execute(Context context) throws Exception {
intamountLeftToBeWithdrawn = (int) context.get("amountLeftToBeWithdrawn);
if (amountLeftToBeWithdrawn >= 100) {
context.put("noOfHundredsDispensed", amountLeftToBeWithdrawn / 100);
context.put("amountLeftToBeWithdrawn", amountLeftToBeWithdrawn % 100);
}
return false;
}
}
OCommands paraFiftyDenominationDispenser &TenDenominationDispenser são semelhantes.
6. Cadeia
AChain é uma coleção de comandos a serem executados em uma ordem especificada. NossoChain consistirá noCommands acima e também em umAuditFilter no final:
public class AtmWithdrawalChain extends ChainBase {
public AtmWithdrawalChain() {
super();
addCommand(new HundredDenominationDispenser());
addCommand(new FiftyDenominationDispenser());
addCommand(new TenDenominationDispenser());
addCommand(new AuditFilter());
}
}
Quando qualquerCommand emChain retorna verdadeiro, ele forçaChain a terminar.
7. Filtro
Um filtro também é umCommand, mas com um métodopostProcess que é chamado após a execução doChain.
NossoFilter enviará uma notificação ao cliente e ao banco:
public class AuditFilter implements Filter {
@Override
public boolean postprocess(Context context, Exception exception) {
// send notification to bank and user
return false;
}
@Override
public boolean execute(Context context) throws Exception {
return false;
}
}
8. Catálogo da Rede
É uma coleção deChainseCommands com seus nomes lógicos.
Em nosso caso, nossoCatalog conterá oAtmWithdrawalChain.
public class AtmCatalog extends CatalogBase {
public AtmCatalog() {
super();
addCommand("atmWithdrawalChain", new AtmWithdrawalChain());
}
}
9. Usando a Corrente
Vamos ver como podemos usar oChain acima para processar uma solicitação de retirada. Primeiro, criaremos umContext e, em seguida, passaremosChain.. OChain processará oContext.
Vamos escrever um caso de teste para demonstrar nossoAtmWithdrawalChain:
public class AtmChainTest {
@Test
public void givenInputsToContext_whenAppliedChain_thenExpectedContext() throws Exception {
Context context = new AtmRequestContext();
context.put("totalAmountToBeWithdrawn", 460);
context.put("amountLeftToBeWithdrawn", 460);
Catalog catalog = new AtmCatalog();
Command atmWithdrawalChain = catalog.getCommand("atmWithdrawalChain");
atmWithdrawalChain.execute(context);
assertEquals(460, (int) context.get("totalAmountToBeWithdrawn"));
assertEquals(0, (int) context.get("amountLeftToBeWithdrawn"));
assertEquals(4, (int) context.get("noOfHundredsDispensed"));
assertEquals(1, (int) context.get("noOfFiftiesDispensed"));
assertEquals(1, (int) context.get("noOfTensDispensed"));
}
}
10. Conclusão
Neste tutorial, exploramos um cenário prático usando a biblioteca Apache Commons Chain do Apache - que você pode ler mais sobrehere.
E, como sempre, o código deste artigo está disponívelover on Github.