DSL 6 - Funciones de Mapeo
|
Para comenzar
El paso del tutorial utiliza el Si en algún momento desea ver la solución a este paso, puede encontrarla en el |
¿Qué es una Función de Mapeo?
A mapping La función es simplemente una función que realiza una traducción de muchos a muchos de los elementos de datos empresariales. Hay tres lugares dentro del DSL donde es posible utilizar mapping funciones. Estas se describen a continuación:
Enriqueciendo el agregado -'Aggregate Functions'
Un agregado es el almacén de datos en vivo para un pago particular, es una especie de resumen de todos los eventos recibidos hasta la fecha en un solo lugar para que pueda ser utilizado rápidamente y transmitido donde sea necesario. Sin embargo, ¿qué sucede si desea realizar una acción contra ese agregado, por ejemplo, transformar algunos datos, rastrear actualizaciones o hacer un cálculo? Nos referimos a este tipo de mapping como una 'Función Agregada', es la capacidad de ejecutar una función sobre los datos agregados cuando llega un nuevo evento.
Una 'función de agregado' por lo tanto es relativamente simple de definir:
-
Una función de agregado ocurre al recibir un evento dado.
-
Una función de agregado tiene acceso a los datos de eventos y a cualquier dato previamente en el agregado.
-
Una función de agregación define qué datos proporciona a cambio.- esto podría ser una actualización de datos anteriores o la generación de nuevos datos.
| Los datos generados por una función de agregado no se persisten en el diario maestro, pero se volverán a ejecutar durante la recuperación del nodo. Por lo tanto, se debe tener cuidado al calcular valores dinámicos como fechas. |
Enriqueciendo el evento -'Enriquecimiento de Entrada'
El segundo uso de mapping Las funciones se utilizan cuando deseamos enriquecer un evento con los datos que recibimos de la entrada junto con los datos que actualmente se poseen en el agregado. Llamamos a este tipo de mapping un 'enriquecimiento de entrada'.
Una 'mejora de entrada' puede definirse de manera similar como:
-
Se produce un enriquecimiento de entrada antes de que se guarde un evento.
-
Una función de enriquecimiento de entrada tiene acceso a los datos de eventos y a cualquier dato previamente en el agregado.
-
Una función de enriquecimiento de entrada define qué datos proporciona a cambio.- esto podría ser una actualización de datos anteriores o la generación de nuevos datos.
-
Los puntos de datos actualizados se añaden al evento.
| Los datos generados por un enriquecimiento de entrada se persisten en el evento y, por lo tanto, tienen una larga duración y se enviarán a continuación a través de las características de procesamiento de datos. |
Suministrando datos para una llamada de acción
El uso final de un mapping la función está en una llamada de acción. Si al llamar a una acción necesita un punto de datos que no se proporciona en otro lugar del flujo, entonces es posible crear esos datos utilizando el mapping. Nos referiremos a esto como un " Action Mapping.
Una 'acción mapping' puede, por lo tanto, definirse simplemente como:
-
Una acción mapping se ejecuta cuando el dominio llama a una acción.
-
Una función de acción tiene acceso a todos los datos agregados.
-
Una función de acción define qué datos proporciona a cambio.
-
La función de acción generada no retiene los datos, por lo que es solo un punto en el tiempo.
Tabla de Tipos de Funciones de Mapeo
| Tipo | Llamado cuando.. | Datos Disponibles | Efecto Secundario | Persistido | Caso de uso |
|---|---|---|---|---|---|
Función Agregada |
Event recibido |
evento, agregado |
Nuevos datos o actualizar existentes |
No |
realice cálculos sobre datos de conteo transitorios |
Enriquecimiento de Entrada |
Antes de guardar el evento |
evento, agregado |
Nuevos datos o actualizar existentes |
Sí |
realice cálculos que deben ser persistidos en el diario |
Action Mapping |
Acción llamada |
agregar |
none |
No |
generación de datos donde esos datos no son relevantes en otra parte del flujo |
Usando un mapping función
Vamos a utilizar una función de agregación como un método para ser más precisos en lo que enviamos a nuestro sistema contable cuando realizamos nuestro Validate Account solicitud. En ese caso, enviamos todo el pacs008 al sistema contable, ahora queremos enviar solo la parte del pacs008 que contiene la información de la cuenta. Por lo tanto, utilicemos una función de agregación como una forma de dividir el pacs.008 y simplemente poniendo la información relevante a disposición.
Configuración de DSL
Configuración de un nuevo Business Data Punto
Hasta ahora, realmente no hemos considerado los datos comerciales, solo utilizando los suministrados.customer transferencia de crédito. Ahora que queremos utilizar un tipo diferente de datos, debemos definir eso para hacerlo disponible en nuestro flujo. Aquí es donde entran los datos empresariales.
Comencemos creando una nueva biblioteca de datos empresariales haciendo clic derecho en nuestro ipftutorialmodel y seleccionando (Nuevo > v2Flo >Business Data Biblioteca).
Se le presentará la pantalla de la biblioteca de datos empresariales donde estableceremos:
-
Una descripción de "Una biblioteca de datos de muestra"
-
Un elemento de datos empresariales (haciendo clic en "Agregar" Business Data ") que contiene:
-
Un nombre de "Cuenta del Acreedor"
-
Una descripción de "los detalles del acreedor"
-
Para el tipo de dato seleccionaremos "Cash Account38" (nota-hay tipos para cada tipo de mensaje ISO, necesitará la versión pacs008
-
Una vez completado, deberíamos ver:
Consejo Principal Cualquier objeto de Java puede ser utilizado como un tipo de dato empresarial. Estos tipos de Java pueden ser importados al proyecto (cubriremos esto en Using custom business data. Si el tipo está en el alcance pero no aparece en la búsqueda anticipada, intente presionar Ctrl+R, ya que esto buscará entre los objetos que no están actualmente importados y que el modelo también puede ver. |
Actualizando la Solicitud
Ahora que tenemos nuestro tipo de dato, el primer trabajo es simplemente reemplazar el " Business Data " en la llamada a la "Solicitud de Validación de Cuenta" para que en lugar de tomar el " Customer Credit Transfer " como datos comerciales de entrada ahora tomamos la "Cuenta del Acreedor". Una vez hecho esto, la nueva definición de solicitud debería verse así:
Eso es todo el soporte configurado, ahora es el momento de crear nuestra función de agregado. Si recordamos, la función debía extraer los detalles del acreedor de la customer transferencia de crédito. En nuestro caso, el customer Los detalles de la transferencia de crédito se reciben en el evento "Iniciación del Flujo", por lo que utilicemos eso para configurar nuestra función de agregado.
Creando una Función de Mapeo para Actualizar Nuestros Datos Agregados
Así que comenzamos haciendo clic en el botón "Agregar Función" en nuestro flujo y luego ingresando los siguientes parámetros:
-
Un nombre de "Extraer Cuenta de Acreedor"
-
Una descripción para "Extrae la cuenta del acreedor del pacs008"
-
los datos de entrada como " Customer Credit Transfer "
-
los datos de salida como "Cuenta del Acreedor"
Así que aquí simplemente estamos proporcionando una función sencilla que puede extraer los detalles del acreedor de la customer transferencia de crédito para que pueda ser utilizada más adelante en el flujo. Nuestra nueva función debería verse así:
A continuación, necesitamos definir dónde queremos que se ejecute nuestra función. En nuestro caso, deseamos que esto se ejecute al inicio del flujo cuando recibamos el inicial.customer transferencia de crédito. Para hacer esto, simplemente actualizamos el comportamiento de iniciación con la función de agregado que hemos definido:
Eso es todo el trabajo de flujo que hemos realizado, el flujo ahora extraerá los detalles de la cuenta del acreedor del pacs008 y utilizará eso para enviarlo al sistema contable.
Ahora analicemos el lado de la implementación de este requisito.
Java Implementación
Ahora volvamos a Intellij y veamos cómo integrar esto en nuestro código de implementación. Como es habitual, comenzaremos ejecutando una compilación desde una ventana de terminal:
mvn clean install
Una vez construido, podemos nuevamente observar el código generado en /domain-root/domain/target, y ahora deberíamos encontrar el puerto para llamar a nuestra función de la siguiente manera (/domain-root/domain/target/classes/com/iconsolutions/ipf/tutorial/ipftutorialmodel/mapping):
public interface IpftutorialflowMappingPort {
ExtractCreditorAccountForFlowIpftutorialflowMappingOutput performExtractCreditorAccount(ExtractCreditorAccountForFlowIpftutorialflowMappingParameters parameters);
}
Aquí podemos ver la definición de nuestra función de puerto, es bastante sencilla. Ahora necesitamos una implementación de adaptador para ello. Hacemos esto de manera habitual añadiéndolo a la declaración de dominio en la configuración del Tutorial IPF. Intente hacerlo ahora y una implementación se encuentra a continuación:
@Bean
public IpftutorialmodelDomain init(ActorSystem actorSystem) {
// All adapters should be added to the domain model
return new IpftutorialmodelDomain. Builder(actorSystem)
.withTutorialDomainFunctionLibraryAdapter(input -> CompletableFuture.completedStage(new DuplicateCheckResponseInput. Builder(input.getId(), AcceptOrRejectCodes. Accepted).build()))
.withAccountingSystemActionAdapter(new SampleAccountingSystemActionAdapter())
.withFraudSystemActionAdapter(new SampleFraudSystemActionAdapter())
.withDecisionLibraryAdapter(input ->
input.getCustomerCreditTransfer().getCdtTrfTxInf().get(0).getIntrBkSttlmAmt().getValue().compareTo(BigDecimal. TEN)>0?
RunFraudCheckDecisionOutcomes. FRAUDREQUIRED: RunFraudCheckDecisionOutcomes. SKIPFRAUD)
.withIpftutorialflowMappingAdapter(input -> new ExtractCreditorAccountForFlowIpftutorialflowMappingOutput(input.getCustomerCreditTransfer().getCdtTrfTxInf().get(0).getCdtrAcct()))
.build();
}
Verificando nuestra Solución
Aquí podemos ver que hemos añadido nuestra función de agregación a nuestra configuración y todo está ahora completo y listo para probar, así que, como es habitual, verifiquemos ahora que la solución funciona. Inicie la aplicación como se indicó anteriormente (las instrucciones están disponibles en Revisando la solicitud inicial si necesita un repaso!)
Entonces podemos enviar un pago:
curl -X POST localhost:8080/submit -H 'Content-Type: application/json' -d '{"value": "5"}' | jq
Nota - La elección del valor de pago es bastante arbitraria aquí, ya que solo estamos interesados en ver el cambio en los datos contables. Para verificar que nuestro cambio está funcionando, necesitaremos observar el agregado en sí. Así que esta vez consultaremos el agregado completo:
Hablemos del pago en el Developer GUI y muestre la vista agregada (busque por id de unidad de trabajo → haga clic en "ver" → "haga clic para ver los datos agregados") y luego, hacia el final de los detalles agregados, deberíamos ver los nuevos detalles de la cuenta del acreedor:
Así que ahí lo tiene, hemos extraído con éxito los detalles del acreedor de nuestro agregado y ahora podemos utilizarlos en otra parte del flujo.
Alternativas
Como se mencionó anteriormente, hay múltiples formas de utilizar mapping funciones. Podemos intentar esto aquí para proporcionar diferentes formas de obtener los datos necesarios para la llamada contable.
Mapeo en el momento de la llamada
El primer enfoque es establecer el mapping función en el punto en que se llama a la función. Para hacer esto, hacemos clic derecho en la llamada de validación de cuenta:
y seleccione " Inspector " desde el menú desplegable (o presione Ctrl+Alt+I) y esto muestra las opciones para la llamada. Aquí podríamos entonces simplemente aplicar nuestro mapping función:
No necesitaríamos entonces nuestro mapping la función en el comportamiento de iniciación, pero desde un punto de vista de implementación, nada cambiaría.
La única diferencia importante aquí es que si usted mirara el agregado (por ejemplo, cargando la transacción en la aplicación de desarrollo y haciendo clic en el botón de ver agregado), entonces los datos no se mostrarían aquí.
Mapeo como un enriquecimiento de iniciación
La siguiente opción es cambiarlo de una función de agregado a un enriquecimiento de entrada. Podemos hacer esto simplemente trasladando la función del comportamiento de entrada a un enriquecimiento de entrada.
Nuevamente, aquí no se necesitarían cambios en la implementación. Podríamos ver la diferencia aquí al observar el 'FLow Initiated'.domain event En la aplicación para desarrolladores, ahora la cuenta del acreedor se persistirá como un elemento de datos aquí.
El mapeo como una función agregada en otros pasos
También podemos ejecutar funciones de agregación en pasos distintos a la enriquecimiento. Para ello, añadimos una función de agregación aquí:
Cuando hacemos clic en el botón 'Agregar Función Agregada', podemos proporcionar el evento y mapping función que queremos aplicar después de que se reciba ese evento. Esto funcionará de la misma manera que la inicial, excepto por el evento que se invoca después. Nuevamente, no se requieren cambios en la implementación, pero recuerde que estos datos tampoco se persistirán y se recrearán al reanudar el flujo.
El mapeo como enriquecimiento de entrada en otros pasos
El enfoque final es agregarlo como parte de la recepción de una entrada, al igual que lo anterior con el enriquecimiento de la entrada en el comportamiento de iniciación. Para hacer esto, simplemente seleccionamos el mapping función que queremos aplicar como parte del bloque de enriquecedores de entrada:
Conclusiones
En esta sección hemos:
-
aprendió a utilizar funciones de agregación para convertir tipos de datos.
Now having configured our application to use an aggregate function, let’s look another capability in: DSL 7 - Handling Timeouts