Introducción
Esta página describirá cómo construir un Scheduled Solución de pago.
Arquitectura
Una consideración necesaria para desarrollar el Scheduled La solución de pago es cómo los componentes principales del IPF se comunicarán. Debe decidir si ellos estarán embedded en una sola aplicación, o se comunicarán a través de la red (es decir, mediante HTTP)
| Cada componente tiene la opción de exponer un HTTP API y una biblioteca de cliente para interactuar con eso HTTP API. |
Una vez decidido, puede comenzar a desarrollar su(s) aplicación(es). Para integrar cada componente en su(s) aplicación(es), el mejor lugar para comenzar es la documentación respectiva de 'introducción':
-
Almacén de Pagos:Introducción
-
Persistent Scheduler:Introducción
-
Liberador de Pagos:Introducción
Implementación
Además de las guías de inicio, hay otras consideraciones de implementación.
Scheduler
Registrar un Scheduling Ayudante
Deberá definir un SchedulingCommand y un SchedulingHelper.
Ambas la aplicación que llama a la Scheduler y el Scheduler en sí mismo deberá estar al tanto de la SchedulingCommand.
package com.iconsolutions.ipf.sample.scheduler.config;
import com.iconsolutions.ipf.core.shared.scheduling.SchedulingCommand;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public class ReleaseBatchCommand implements SchedulingCommand {
private final String unitOfWorkID;
}
El SchedulingHelper debe llamar al Liberador de Pagos cuando se ejecute el comando.
import com.iconsolutions.ipf.core.releaser.PaymentReleaser;
import com.iconsolutions.ipf.core.shared.domain.context.UnitOfWorkId;
import com.iconsolutions.ipf.core.shared.scheduling.SchedulingCommand;
import com.iconsolutions.ipf.core.shared.scheduling.SchedulingHelper;
import lombok.RequiredArgsConstructor;
import java.util.concurrent.CompletionStage;
@RequiredArgsConstructor
public class ReleaseBatchSchedulerHelper implements SchedulingHelper {
private final PaymentReleaser paymentReleaser;
@Override
public CompletionStage<Void> execute(String id, SchedulingCommand schedulingCommand) {
var releaseBatchCommand = (ReleaseBatchCommand) schedulingCommand;
var unitOfWorkID = releaseBatchCommand.getUnitOfWorkID();
return paymentReleaser
.releaseInstruction(UnitOfWorkId.of(unitOfWorkID))
.thenApply(unused -> null);
}
@Override
public boolean supports(SchedulingCommand request) {
return request instanceof ReleaseBatchCommand;
}
}
Por supuesto, si usted está integrando con el Payment Releaser a través de HTTP debe utilizar la Biblioteca del Cliente en su lugar.
import com.iconsolutions.ipf.core.releaser.model.SupportingBusinessDataMapForReleaseOperation;
import com.iconsolutions.ipf.core.shared.domain.context.propagation.ContextPropagation;
import com.iconsolutions.ipf.core.shared.scheduling.SchedulingCommand;
import com.iconsolutions.ipf.core.shared.scheduling.SchedulingHelper;
import com.iconsolutions.ipf.releaser.api.client.port.ReleaseInstructionClientPort;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.CompletionStage;
@Slf4j
@RequiredArgsConstructor
public class ReleaseBatchViaHttpSchedulerHelper implements SchedulingHelper {
private final ReleaseInstructionClientPort paymentReleaserAdapter;
@Override
public CompletionStage<Void> execute(String id, SchedulingCommand schedulingCommand) {
var releaseBatchCommand = (ReleaseBatchCommand) schedulingCommand;
var unitOfWorkID = releaseBatchCommand.getUnitOfWorkID();
return paymentReleaserAdapter
.releaseInstruction(
ContextPropagation.getProcessingContext(),
unitOfWorkID,
new SupportingBusinessDataMapForReleaseOperation())
.thenApply(unused -> null);
}
@Override
public boolean supports(SchedulingCommand request) {
return request instanceof ReleaseBatchCommand;
}
}
Los ejemplos anteriores llaman al releaseInstruction métodos, sin embargo, usted puede optar por primero prepareInstruction.
Si está utilizando la implementación predeterminada de Payment Releaser, esto activará posteriormente el releaseInstruction operación.
|
Liberador de Pagos
Implementación predeterminada
Para comenzar, recomendamos utilizar la implementación predeterminada. Se puede encontrar más información en el Procesador de Entradas de Pago documentación.
| El liberador de pagos predeterminado se integra con el almacén de pagos como un embedded solución. Si desea que el Liberador de Pagos interactúe con el Almacén de Pagos sobre HTTP tendrá que customise su implementación de Payment Releaser. |
Programe y Libere Su Primer Lote/Instrucción
Una vez que haya construido su(s) aplicación(es) siguiendo las respectivas guías de inicio, puede programar y liberar su primer lote/instrucción.
Los pasos dados por cada componente en la solución se describen en el diagrama contextual en la página de inicio.
La lista a continuación detalla las operaciones que su aplicación de llamada (por ejemplo, la aplicación de iniciación) debe ejecutar para programar pagos. Los pasos utilizan un ejemplo de un BULK un pago que consiste en un pago por LOTE, y ese pago por LOTE consiste en dos pagos por TRANSACCIÓN:
-
Guarde el BULK, BATCH y dos entradas de pago de TRANSACTION al Almacén de Pagos.
-
Solución de biblioteca de cliente HTTP: a través de la
PaymentWarehouseClientPortinterfaz (ver Guarde una entrada de pago a través de la biblioteca del cliente.) -
Solución embebida: a través de la
PaymentWarehouseinterfaz (ver Guarde su primera entrada de pago)
-
-
Programe el LOTE para ser liberado 1 minuto en el futuro llamando al Persistent Scheduler
-
Solución de biblioteca de cliente HTTP: a través de la
SchedulingModuleInterfaceinterfaz (ver Scheduling Su Primer Trabajo (a través de HTTP Biblioteca del Cliente)) -
Solución embebida: a través de la
SchedulerConnectorInterfaceinterfaz (ver Programe el trabajo)
-
-
¡Observe los resultados! Su servicio de ejecución debe recibir 2 transacciones del liberador de pagos.