Definiendo el lado de lectura
El ipf-read-starter proporciona una configuración base de Mongo que puede ampliarse para su uso en implementaciones. El lado de lectura admite múltiples flujos diferentes ejecutándose con un único lado de lectura.
La clave de la configuración del lado de lectura es la clase abstracta 'MongoReadModelEntity'. Proporciona:
-
persistenceId- el id de persistencia (el IPF ID p. ej., Payoutflow|ABC) -
originatingId- el id de origen del flujo (p. ej., UPRID) -
originatingMessageType- el tipo de mensaje de origen (p. ej., ExecutePaymentRequest) -
firstEventTime- la hora en la que se registró el primer evento en la transacción -
lastProcessedEventTime- la hora en la que se registró el evento más reciente en la transacción -
lastEventName- el nombre del evento más reciente -
initiatingTimestamp- cuándo se inició el flujo -
alternativeIds- una lista de ids alternativos por los que pueda conocerse la transacción -
eventSummaries- una lista de resúmenes de eventos para todos los eventos de la transacción -
payload- el payload de la transacción, según el API (por ejemplo, podría ser CreditTransferPayload, ReturnsPayload, etc.)
La implementación de esta clase es específica de la aplicación ya que depende de ser poblada por datos recibidos en eventos personalizados. Por esta razón, es necesario que la aplicación proporcione la implementación concreta. Para ello, deberán implementarse los siguientes métodos:
protected abstract Supplier<T> payloadCreator();
protected abstract BiFunction<Event, T, T> payloadUpdater();
-
payloadCreator - se requiere para proporcionar una nueva instancia del tipo de payload.
-
payloadUpdater - se requiere para determinar cómo el evento dado debe actualizar el payload actual.
-
originatingMessageTypeSupplier - se requiere para especificar el nombre (del registro de mensajes) del mensaje iniciador del flujo.
Además de los 3 métodos anteriores, hay varios métodos que tienen implementaciones por defecto que pueden sobrescribirse:
protected Set<String> getAlternativeIdsFrom(Event event) {
return Collections.emptySet();
}
-
getAlternativeIdsFrom - por defecto devuelve una colección vacía; este método debe extraer cualquier id que deba usarse para la búsqueda.
-
getInitiatingTimestampFrom - por defecto utiliza la hora createdAt del primer evento recibido, pero puede sobrescribirse para usar los datos de cualquier evento.
-
getOriginatingIdFrom - por defecto utiliza el commandId del primer evento recibido, pero puede sobrescribirse para usar los datos de cualquier evento.
Una vez creada la implementación concreta de MongoReadModelEntity, debe registrarse creando una factoría que determine qué implementación debe usarse en función del IPF ID recibido.
public interface ReadModelEntityFactory {
ReadModelEntity create(String persistenceId);
}
com.iconsolutions.ipf.platform.read.transaction Esto debe registrarse como un bean de Spring.
Ejemplo
Lo siguiente muestra un ejemplo de implementación de MongoReadModelEntity.
@Data
@AllArgsConstructor
public class TestCreditTransferTransactionReadModel extends MongoReadModelEntity<CreditTransferPayload> {
@Override
protected Supplier<CreditTransferPayload> payloadCreator() {
return () -> CreditTransferPayload.builder().build();
}
@Override
protected BiFunction<Event, CreditTransferPayload, CreditTransferPayload> payloadUpdater() {
return (evt, returnPayload) -> {
if (evt instanceof TestFIToFICustomerCreditTransferEvent) {
returnPayload.setCreditTransfer(((TestFIToFICustomerCreditTransferEvent) evt).getCreditTransfer());
}
return returnPayload;
};
}
}
Para registrarlo, creamos la factoría:
@Slf4j
public class ReadModelEntityTestFactory implements ReadModelEntityFactory {
@Override
public ReadModelEntity create(String persistenceId) {
log.debug("PersistenceId found on read side: {}", persistenceId);
return new ReadSideFlowTestModel();
}
}
Indexación
El ipf-read-starter tiene una configuración por defecto para crear automáticamente índices de MongoDB en la inicialización.
La creación de índices por defecto puede deshabilitarse con:
ipf.read-starter.mongodb.create-indexes=false
Los índices pueden deshabilitarse globalmente con:
ipf.mongodb.create-indexes=false
Para deshabilitar la indexación globalmente pero mantenerla para la transaction cache, aplica lo siguiente, respetando el orden:
ipf.mongodb.create-indexes=false
ipf.read-starter.mongodb.create-indexes=true
Commit Quorum
El commit quorum puede controlarse de forma similar con:
ipf.read-starter.mongodb.commit-quorum=1
O sobrescribirse globalmente con:
ipf.mongodb.commit-quorum=1