DSL 3 - Uso de una Función de Dominio

Para comenzar

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 es 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 simple

A continuación, debemos elegir los datos empresariales que enviaremos a nuestra función de dominio. En este caso, vamos a enviar el customer transferencia de crédito 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 solo 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 dato comercial, por lo que podemos dejarlo en blanco, pero aquí puede agregar datos comerciales simplemente haciendo clic en "CTRL + SPACE" en el cuadro nuevamente y seleccionando entre las opciones de datos comerciales.

  • Para los códigos de respuesta, como simplemente necesitamos una respuesta positiva y una 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 los códigos de razón, así que los ignoraremos por ahora.

  • Para completar la bandera, dejaremos la opción predeterminada seleccionada.

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 al estado completo:

domain 5

Ahora cambiaremos esto para que llamemos a nuestra función de dominio, y si tiene éxito, pasaremos al estado completo, pero en caso de fallo, pasaremos a un nuevo estado rechazado.

Primero que nada, necesitaremos crear dos nuevos estados:

  • Verificación de duplicados-este será el estado en el que se encuentra el flujo mientras se realiza la verificación de duplicados.

  • Rechazado-este será nuestro estado de fallo para cuando la verificación de duplicados haya fallado.

Agreguemos estos al flujo haciendo clic en "Agregar State " botón dentro de la sección de estado 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:

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

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

La otra cosa que puede notar en la captura de pantalla anterior (y en 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 con subrayado rojo; 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á el cuadro emergente de intenciones, una de las opciones aquí será "Validar Flujo". Si usted selecciona esto, se abrirá el cuadro 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 nuestro nuevo "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 transferencia de crédito, pasaremos al estado de verificación de duplicados y llamaremos 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í son los eventos que ocurrirán cuando recibamos nuestra respuesta de verificación de duplicados. En nuestro caso, queremos dos eventos:

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

  • Para indicar que la verificación de duplicados ha fallado y que esta es una duplicación de una transacción existente.

Creemos estos dos eventos haciendo clic en "Agregar Event " botón, en el " Event Sección de "Definiciones" de nuestro flujo.

domain 9

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

Ahora que hemos configurado nuestros eventos, necesitamos manejar la recepción de la respuesta real de verificación 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

Aquí, para la entrada, necesitamos ingresar dos comportamientos de entrada: uno que se base en una respuesta de verificación de duplicados exitosa que se reenvía al evento de verificación de duplicados aprobada, y el otro en el caso de fallo que va al evento de verificación de duplicados fallida. 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 evento que deseamos generar " Event "Selección" (nuevamente utilizando "CTRL + ESPACIO").

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 evento particular mientras se encuentra en un estado (o estados) determinado(s). 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 estado de éxito solo debe ocurrir cuando estemos en la "Verificación de Duplicados" State " así que seleccionamos eso.

  • "Cuando" - dejaremos esto como "Activado" - esto significa que cada vez que se reciba este evento, activaremos el comportamiento.

  • "For Event " - ese es el evento que nos interesa, así 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á al estado de "Verificación de Duplicados", llamará a la función de verificación de duplicados y, dependiendo del resultado, se moverá al estado de "Completo" o "Rechazado".

Ahora que hemos definido nuestra función de dominio y le hemos indicado a nuestro flujo cómo utilizarla dentro de su procesamiento, es momento de analizar 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 al 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. Por lo tanto, 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á los eventos apropiados.

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" que 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 la clase java "IpfTutorialConfig" (en la aplicación ipf-tutorial-app). 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". Así que 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 veremos cómo proporcionar 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 agregar 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 (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

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 pestaña (buscar por id de unidad de trabajo, 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 el evento como el "Chequeo de Duplicados Aprobado". Por lo tanto, sabemos que todo está funcionando y que nuestro chequeo de duplicados se está invocando con éxito.

Conclusiones

En esta sección hemos aprendido a utilizar funciones de dominio, tanto definiéndolas dentro del DSL como implementándolas en el Java solución.