DSL 3 - Uso de una Función de Dominio

Iniciando

El paso del tutorial utiliza la solución "inicial" del proyecto como su punto de partida.

Si en algún momento desea ver la solución a este paso, puede encontrarla en "add_domain_function" bajo soluciones.

¿Qué es una Función de Dominio?

Una "Función de Dominio" es cualquier proceso que usted necesita llevar a cabo dentro de los límites de su dominio. Esto podría ser una serie de cosas como cálculos simples,mapping o invocando reglas de negocio.

Objetivo

Queremos que nuestro flujo realice una verificación de duplicados utilizando una función de dominio. Enviaremos nuestro pacs. 008 a la verificación de duplicados, y esperamos que devuelva ya sea un éxito (no duplicado) o un fallo (es duplicado).

Configuración de DSL

Añadiendo la Función de Dominio

Primero, cree una nueva biblioteca de funciones de dominio para contener nuestra función. Desde el navegador a la izquierda, haga clic derecho en el modelo:

domain 1

Y luego, haga clic derecho, seleccione Nuevo > v2Flo > Biblioteca de Funciones de Dominio. Cuando se le solicite, ingrese un nombre y una descripción para la biblioteca de la siguiente manera:

domain 2

Ahora haga clic en el botón "Agregar Función de Dominio", esto llenará la tabla con una nueva fila.

domain 3

Para comenzar, añadamos el nombre y la descripción de nuestra función de dominio.- estos son cuadros de entrada de texto libre simples:

  • Nombre - Verificación de duplicados

  • Descripción - Una verificación de duplicados sencilla

A continuación, debemos elegir el business data enviamos a nuestra función de dominio. En este caso, vamos a enviar el customer credit transfer(pacs. 008) en sí mismo. Para hacer esto, utilizaremos el MPS la capacidad de selección al presionar "CTRL + SPACE", esto presentará una lista de posibles elementos de datos que tenemos disponibles. Seleccione el " Customer Credit Transfer.

Después de utilizar "CTRL+SPACE" para mostrar las opciones, puede comenzar a escribir y esto reducirá las opciones únicamente a aquellas que coincidan con lo que ha ingresado.

Ahora necesitamos definir la respuesta a nuestra función de dominio. Para hacer esto, simplemente presione "RETURN" en el cuadro de respuesta para generar una nueva respuesta, y luego para las propiedades de nuestra respuesta:

  • Para el nombre utilizaremos "Respuesta de Verificación de Duplicados"

  • Para la descripción utilizaremos "Una respuesta de la verificación de duplicados".

  • Para nuestra verificación de duplicados, no esperamos que devuelva ningún business data así que podemos dejarlo en blanco, pero aquí podría añadir business data simplemente haciendo clic en "CTRL + SPACE" en el cuadro nuevamente y seleccionando de los business data opciones.

  • Para response codes, ya que simplemente necesitamos una respuesta positiva y negativa, podemos utilizar los códigos incorporados "AcceptOrReject". Así que nuevamente aquí utilizamos "CTRL + SPACE" para mostrar las opciones y elegir la opción "AcceptOrReject".

  • Para nuestra verificación de duplicados, no necesitamos preocuparnos por reason codes así que los ignoraremos por ahora.

  • Para completar flag, dejaremos el predeterminado seleccionado.

Volverá a las banderas de finalización en un tutorial posterior.

Si ha ingresado todo correctamente, la definición de la función de su dominio debería verse así:

domain 4

Esa es nuestra función de dominio definida, ¿cómo la utilizamos dentro de nuestro flujo?

Llamando a la Función de Dominio

Actualmente, en nuestro flujo, al iniciar simplemente nos movemos directamente a la completa state:

domain 5

Ahora cambiaremos esto para que llamemos a nuestra función de dominio, y si tiene éxito, pasaremos a la completa.state pero en caso de fallo, nos moveremos a un nuevo rechazado state.

Primero que nada, necesitaremos crear dos nuevos estados:

  • Verificación de duplicados-esto será el state el flujo está en mientras se realiza la verificación de duplicados.

  • Rechazado-esto será nuestro fracaso state para cuando la verificación de duplicados tenga failed.

Agreguemos estos al flujo haciendo clic en "Agregar State " botón dentro del state sección del flujo y luego configurándolos de la siguiente manera:

domain 6

Hablemos brevemente sobre los otros valores que hemos configurado aquí:

En nuestro caso:

  • La verificación de duplicados state está en medio del flujo mientras el proceso aún está en curso y se espera más trabajo-por lo tanto seleccionamos el PENDING global state y marque el state como no terminal.

  • El rechazado state sucede cuando el flujo ha terminado de manera no exitosa, por lo que utilizamos el REJECTED global state y como no se espera más trabajo, lo marcamos como terminal state.

La otra cosa que puede notar en la captura de pantalla anterior (y su implementación) es que los dos nuevos estados están subrayados en rojo. Este es un tema común dentro de MPS que los errores están marcados en rojo subrayado, si pasamos el cursor sobre el subrayado podemos ver que ambos errores se deben a que los estados aún no se utilizan en el flujo. Usted solucionará esto en el futuro.

A veces puede ser difícil pasar el cursor sobre el error, en estos casos hay dos opciones adicionales:

En el lado derecho del flujo habrá pequeñas líneas rojas que indican dónde se encuentran los errores en el flujo; pase el cursor sobre estas para ver el error.

Si usted presiona "ALT+ENTER" en cualquier parte del flujo, aparecerá la ventana emergente de intenciones, una de las opciones aquí será "Validar Flujo". Si usted selecciona esto, se abrirá la caja de validación del flujo mostrando claramente los errores como:

domain 7

Aquí puede simplemente hacer doble clic en un error para ser llevado directamente al punto de fallo.

Ahora volvamos a nuestro " Initiation Behaviour "y cámbielo para invocar nuestra función de dominio." Para hacer esto, cambiamos el "Mover a" State " de "Completo" a nuestra nueva "Verificación de Duplicados" que ahora debería estar disponible en las opciones." A continuación, seleccionamos la función "Verificación de Duplicados" dentro del bloque "Realizar Acciones", seleccionamos 'Realizar Acción' y luego elegimos nuestra nueva función de dominio de la lista.

Una vez completado, debería verse así:

domain 8

Así que ahora, cuando nuestro flujo recibe el customer credit transfer, procederemos a la verificación de duplicados state y llame a nuestra función de verificación de duplicados. El siguiente paso es procesar la respuesta que recibimos de él.

Uso de la Respuesta de la Función de Dominio

Lo primero que necesitamos definir aquí es el events que ocurrirá cuando recibamos nuestra respuesta de cheque duplicado. En nuestro caso queremos dos events:

  • Para significar que la verificación de duplicados ha sido superada y que esta es una transacción única.

  • Para significar que la verificación de duplicados ha failed y que esto es un duplicado de una transacción existente.

Creemos estos dos events al hacer clic en "Agregar Event " botón, en el " Event Sección de "Definiciones" de nuestro flujo.

domain 9

Tenga en cuenta que para estos events, no estamos recibiendo ningún dato, por lo que el business data la columna está en blanco. Podemos ver nuevamente que hay errores en nuestros dos events, consulte para ver por qué.

Ahora que tenemos nuestro events En la configuración, necesitamos gestionar la recepción de la respuesta real del chequeo de duplicados. La respuesta es un tipo de entrada, por lo que para procesarla debe ir a "Comportamiento de Entrada". Haga clic en el botón "Agregar Comportamiento de Entrada" en nuestro flujo, y deberíamos ver esto:

domain 10

Así que aquí para la entrada necesitamos ingresar dos input behaviours, uno que se basa en una respuesta de verificación de duplicados exitosa que reenvía a la verificación de duplicados aprobada event, y el otro en el caso de fallo que va a la verificación de duplicados failed event. Si configuramos estos dos, deberíamos ver:

Seleccione nuestra "Respuesta de Función de Dominio" (nuevamente utilizando "CTRL + SPACE"). Para nuestro código de respuesta, comenzaremos con el caso "Aceptado", así que seleccione eso. Entonces debemos considerar el event deseamos aumentar " Event Selección" (nuevamente utilizando "CTRL + SPACE").

domain 11

Nuevamente, verifique los errores ("ALT+ENTER" → "Validar Flujo"), y veremos que ahora nos está indicando que necesitamos utilizar estas entradas en nuestro flujo.

domain 12

El paso final es agregar el " Event Behaviours. Esto indica al flujo cómo actuar cuando recibe un particular event mientras en un dado state(o estados). Así que hagamos clic en "Agregar Event "Comportamiento" y deberíamos ver:

domain 13

Así que en nuestro caso:

  • "Con Actual" State " - este procesamiento del éxito state debe ocurrir únicamente cuando estemos en la "Verificación de Duplicados" State " así que seleccionamos eso."

  • "Cuándo" - dejaremos esto como "Activado" - esto significa que cada vez que esto event se recibe, activaremos el comportamiento.

  • "For Event " - eso es nuestro event estamos interesados en, por lo que para el caso de éxito - "Verificación de duplicados aprobada"

  • "Mover a" State " - Para el éxito, simplemente vamos a movernos a "Completo", así que seleccione eso.

  • "Realizar Acción" - por ahora este es el final de nuestro flujo, así que dejaremos esto en blanco.

Cuando esté completo, nuestra nueva línea debería verse así:

domain 14

Ahora necesitamos agregar el bloque equivalente para el caso de fallo, vea si puede ingresar esto usted mismo y cuando esté listo, compare con la solución a continuación.

domain 15

Una vez completado, deberíamos poder validar nuestro flujo nuevamente ("ALT+ENTER" → "Validar Flujo") y ver que todos los errores han sido corregidos.

domain 16

Eso es todo, ahora hemos añadido nuestro nuevo paso a nuestro flujo. Para verlo en forma de diagrama, puede abrir el Visor de Flujos (Tools > Open Flow Viewer`): y veremos:

Flujo

Aquí podemos ver que, al iniciar, nuestro flujo se moverá a la "Verificación de Duplicados".state, llamará a la función de verificación de duplicados y luego, dependiendo del resultado, se moverá a "Completo" o "Rechazado".state.

Ahora que hemos definido nuestra función de dominio y hemos indicado a nuestro flujo cómo utilizarla dentro de su procesamiento, es momento de examinar cómo proporcionamos una implementación para la función de dominio.

Java Implementación

Definiendo el Adaptador

Cambiemos a IntelliJ para trabajar con el Java lado.

Primero necesitamos regenerar el código de la aplicación para recoger los cambios que hemos realizado en nuestra edición de DSL. Usted hará esto ejecutando lo siguiente desde la raíz de nuestro módulo inicial (solutions/initial):

mvn clean install

Esto debería tomar un minuto aproximadamente, ya que se generan todo el código y las dependencias. Una vez que esté completo, navegue hasta el directorio objetivo del proyecto raíz del dominio/dominio, y deberíamos ver algunas clases clave:

   package com.iconsolutions.ipf.tutorial.adapters;

   import com.iconsolutions.ipf.tutorial.actions. DuplicateCheckAction;
   import com.iconsolutions.ipf.tutorial.inputs. DuplicateCheckResponseInput;
   import java.util.concurrent. CompletionStage;

   public interface TutorialDomainFunctionLibraryPort {
      CompletionStage<DuplicateCheckResponseInput> execute(DuplicateCheckAction var1);
   }

Este método es la definición de nuestra interfaz para la función de dominio. Cuando la aplicación recibe la solicitud de iniciación, realizará una llamada a esta interfaz para invocar la función de dominio y, en función de la respuesta, generará la correspondiente.events.

Consulte las clases "DuplicateCheckAction" y "DuplicateCheckResponseInput". Verá que en nuestros casos, el "DuplicateCheckAction" es un POJO estándar que contiene algunos metadatos basados en el flujo junto con el pacs. 008 entrada que definimos. De manera similar, el elemento clave en el "DuplicateCheckResponseInput" es el código de respuesta enum "AcceptOrReject", el cual nos permite definir el resultado de nuestra verificación de duplicados.

Para utilizar esto, necesitamos proporcionar una implementación de la interfaz.

Esta implementación podría ser tan compleja como se requiera, pero para la simplicidad de este tutorial, simplemente vamos a devolver una respuesta de éxito.

La implementación debe ser añadida a la definición del dominio, así que comencemos abriendo el "IpfTutorialConfig".java clase (en la aplicación ipf-tutorial). La parte interesante de esto es la configuración del dominio que actualmente es:

@Bean
public IpftutorialmodelDomain init(ActorSystem actorSystem) {
   // All adapters should be added to the domain model
   return new IpftutorialmodelDomain. Builder(actorSystem).build();
}

Con la arquitectura hexagonal, nuestra implementación del "Puerto" se denomina "Adaptador". Por lo tanto, añadamos un adaptador a esta configuración en línea proporcionando una función que simplemente devuelva un nuevo CompletableFuture que contenga una respuesta de verificación de duplicados exitosa. Esta es solo una solución simple para este paso del tutorial; más adelante en la serie de tutoriales, examinaremos la provisión de funciones más enriquecidas.

Nuestro nuevo código debería verse así:

@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()))
.build();
}

Eso es todo lo que necesitamos hacer para añadir la función de dominio en nuestra ejecución de flujo.

Verificando nuestra Solución

Como es habitual, ahora verifiquemos que la solución funciona. Inicie la aplicación como se indicó anteriormente (instructions están disponibles en Revisando la solicitud inicial si necesita un repaso!)

Entonces podemos enviar un pago:

curl -X POST localhost:8080/submit

Y finalmente, si mencionamos el pago en el Developer GUI, utilizando el uowId devuelto en el curl POST anterior (por ejemplo, "uowId":"53518cec-5a24-4b9a-8477-8bb5526af959") y muestre el domain events tab (buscar por unit of work id, haga clic en ver, haga clic domain events)

domain 18

Aquí podemos ver que, mientras que antes solo obteníamos el "Flujo Iniciado" Event, ahora obtenemos tanto esto COMO el "Chequeo de Duplicados Aprobado" event¡Por lo tanto, sabemos que todo está funcionando y que nuestra verificación de duplicados se está invocando con éxito!

Conclusiones

En esta sección hemos aprendido a utilizar domain functions, definiéndolos dentro del DSL e implementándolos en el Java solución.