Defining a Custom Multiple Duplicate Check Key Mapping
Esta página explica cómo definir un mapping para un multiple duplicate check; por ejemplo, cuando quieres realizar duplicate checks sobre un mensaje que contiene múltiples transacciones.
1. Add a mapping function
Dentro de tu proyecto MPS, agrega una Mapping Library a tu modelo. Haz clic derecho en tu modelo y elige new → v2Flo → Mapping Library.
Los datos de salida deben ser Duplicate Check Multiple Request. Este debe especificar el transactionCacheEntryType y un mapa de entradas para las que deseas realizar duplicate checks.
2. Use the mapping function within your flow
Dentro de tu MPS flow, haz clic izquierdo en la llamada a la acción checkMultipleDuplicate en la que quieres usar el custom mapping.
Pulsa Ctrl+Alt+I para abrir el Inspector. Cambia el Mapping en el inspector por tu mapping function.
3. Implement your mapping adapter
Debes proporcionar una implementación Java de tu mapping function y aportarla en tu domain declaration como un adapter.
Por ejemplo:
public class CustomDuplicateCheckMappingAdapterMultiple implements CustomDuplicateCheckMappingMappingPort {
@Override
public CustomMultipleDuplicateMapFromPain001MappingOutput performCustomMultipleDuplicateMapFromPain001(CustomMultipleDuplicateMapFromPain001MappingParameters inputParameters) {
// Logic to build a map of Duplicate Check Keys here
var txnCounter = new AtomicInteger(0);
Map<String, DuplicateCheckKey> duplicateCheckKeyMap = Optional.ofNullable(inputParameters.getPaymentInitiation())
.map(CustomerCreditTransferInitiationV09::getPmtInf)
.map(instruction -> instruction.stream()
.flatMap(CustomDuplicateCheckMappingAdapter::createCustomDuplicateCheckKeyForPain001Transaction)
// Using a linked hashmap to preserve order
.collect(Collectors.toMap(__ -> createIdForMultipleDuplicateCheck(inputParameters.getId(), txnCounter), Function.identity(), (x, y) -> y, LinkedHashMap::new))))
.orElseThrow(() -> new IconRuntimeException("No payment initiation found"));
return new CustomMultipleDuplicateMapFromPain001MappingOutput(DuplicateCheckMultipleRequest.builder()
.transactionCacheEntryType("PAIN_001_MULTIPLE_CUSTOM")
.duplicateCheckKeyMap(duplicateCheckKeyMap)
.build());
}
}
Lo anterior itera a través de las transacciones del mensaje pain.001 proporcionado y construye un mapa de entradas DuplicateCheckKey.
Este mapa se envuelve en un Duplicate Check Key Multiple Request que sirve como entrada para la función checkMultipleDuplicate, la cual procesará cada entrada y realizará un duplicate check, recopilando los resultados en un Duplicate Check Key Multiple Response. Además del mapa de Duplicate Check Keys, también puedes especificar el transactionCacheEntryType en la request (establecido en CheckMultipleDuplicatePain001 arriba); si no se especifica, se usará el nombre de la action como predeterminado.
@Bean
public DuplicatecheckexampleDomain duplicatecheckexampleDomain(ActorSystem actorSystem,
CustomDuplicateCheckMappingMappingPort customDuplicateCheckMappingAdapter,
Dispatcher floDispatcher) {
return new DuplicatecheckexampleDomain.Builder(actorSystem)
.withCustomDuplicateCheckMappingMappingAdapter(customDuplicateCheckMappingAdapter)
.withDispatcher(floDispatcher)
.build();
}
Puedes encontrar más detalles sobre el uso de mapping functions en DSL 6 - Mapping Functions.
4. Handling multiple duplicate check responses
Al manejar el código de respuesta CONTAINS_DUPLICATES en tu flow, debes agregar el elemento de business data Duplicate Check Multiple Response al evento asociado como se muestra a continuación:
Esto pondrá los resultados a disposición del procesamiento posterior en tu flow.
Se muestra a continuación un ejemplo de Duplicate Check Failed con el mapa de resultados. Se preserva el orden de las entradas desde el mensaje de origen. En el ejemplo, el orden en el mapa de respuesta es el mismo que el orden de las transacciones en el mensaje de origen. La clave se puede usar en el mapa de Duplicate Check Multiple Request para recuperar la duplicate key original utilizada para realizar el duplicate check.