Usar la biblioteca cliente de Debulker
Esta guía explica cómo usar la Debulker Client Library para recibir notificaciones de archivos en una aplicación IPF.
Propósito
Si usas debulking en combinación con IPF, querrás recibir una notificación de la llegada (y del debulking completado) de un archivo agrupado. Esta Client Library combina los siguientes componentes en una sola dependencia:
-
Elección de transporte (Kafka)
-
Elección de tipo de component store (MongoDB)
-
Elección de backend de gestión de archivos (Local, S3)
Pasos
Así es como puedes comenzar a llamar a la Debulker Client Library
Paso 1: Añadir la dependencia
La dependencia que uses depende de los enlaces de transporte que quieras usar. Actualmente, solo Kafka es compatible para Debulker.
NOTA: Esta dependencia está disponible como parte del ipf-release-core-bom. Si utilizas el IPF BOM no necesitas especificar versiones; recibirás la versión de la Debulker Client Library que ha sido validada con esa versión del BOM.
| Database type | Transport type | Dependency |
|---|---|---|
MongoDB |
Kafka |
<dependency>
<groupId>com.iconsolutions.ipf.debulk</groupId>
<artifactId>ipf-debulker-client-starter-mongo-kafka</artifactId>
</dependency>
|
Paso 2: Crear una implementación de la Debulker Client Library
Para que el Spring Boot AutoConfigure de ipf-debulker-client-starter-mongo-kafka realice todo el wiring relevante, el Spring Context debe tener una implementación de com.iconsolutions.ipf.debulk.client.DebulkInitiationClientAdapter antes de que se habilite nada.
Esta implementación también debe ser un bean de Spring. Por lo tanto, la implementación más sencilla para activar la Debulker Client Library sería:
import com.iconsolutions.ipf.debulk.client.DebulkInitiationClientAdapter;
import org.springframework.stereotype.Component;
@Component (1)
public class MyDebulkInitiationClientAdapter implements DebulkInitiationClientAdapter { (2)
}
| 1 | Definirlo como un bean de Spring |
| 2 | Implementar la interfaz |
Ten en cuenta que no tienes que implementar el método de la interfaz para poner la aplicación en marcha. La implementación por defecto lanzará una excepción si de alguna manera terminas recibiendo un mensaje y no has implementado esa interfaz. Si miramos la implementación por defecto de handle:
default CompletionStage<Void> handle(ReceivingContext receivingContext, InitiateComponentProcessingCommand initiateComponentProcessingCommand) {
throw new IconRuntimeException("Please implement the DebulkInitiationClientAdapter's handle method");
}
La implementación depende de lo que quieras hacer con el mensaje, pero normalmente implicaría llamar a un flujo IPF usando los métodos estáticos XxxDomain, por ejemplo:
@Override
public CompletionStage<Void> handle(ReceivingContext receivingContext,
InitiateComponentProcessingCommand payload) {
var bulkId = BulkId.builder()
.value(payload.getBulkId())
.build();
return componentStore.findAllByBulkIdAndMarkerFlux(bulkId, "Document")(1)
.flatMap(bulk -> {
var bulkCmd = new InitiateBulkFlowInput.Builder(bulk.getBulkId().getValue())
.withBulkId(payload.getBulkId())
.withComponentId(bulkId.getValue())
.withPaymentJourneyType("BULK")
.withProcessingContext(ProcessingContext.builder()
.unitOfWorkId(bulk.getId().getValue())
.clientRequestId(bulk.getBulkId().getValue())
.processingEntity("BANK_ENTITY_1")
.build())
.withGroupHeader(xmlMapper.fromXML(bulk.getContent(), Document.class).getCstmrCdtTrfInitn().getGrpHdr())(2)
.build();
return Mono.fromCompletionStage(BulkDomain.initiation().handle(bulkCmd)); (3)
})
.collectList()
.toFuture()
.thenAccept(dones -> log.info("Started bulk: {}, {}", payload, dones));
}
| 1 | Un component store debería inyectarse como dependencia en tu implementación para recuperar el componente relevante del store |
| 2 | Usar un XMLMapper inyectado para crear un objeto Document de pain.001 que pasar al flow |
| 3 | Crear una nueva instancia de BulkFlow |