DSL 4 - Uso de un Dominio Externo

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

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

En esta sección vamos a investigar cómo podemos solicitar información de sistemas externos y recibir sus respuestas.

¿Qué es un Dominio Externo?

Desde la perspectiva de DSL, un dominio externo es cualquier otro dominio con el que necesitamos interactuar. Esto es lo que nos referimos como un "Dominio Externo". Generalmente, este es otro sistema bancario como Fraude o Contabilidad, pero podría ser, por ejemplo, otro sistema IPF.

Podemos interactuar con un dominio externo de tres maneras clave:

  • A través de una "Instrucción" - estos son cuando el dominio externo pushes información hacia nosotros.

  • A través de una "Solicitud" - esto es cuando solicitamos información de un dominio externo.

  • A través de una "Notificación" - esto es cuando nosotros push información a un dominio externo.

Como ejemplo para nuestro flujo, vamos a añadir un paso a nuestro flujo que nos permitirá realizar una llamada a un Sistema de Contabilidad que validará nuestra cuenta.

Desde un punto de vista lógico, aquí queremos enviar la información de la cuenta y recuperar si la cuenta es válida. Para hacerlo un poco más complejo, diremos que el sistema de cuentas puede devolver tres respuestas:

  • Éxito

  • Fallo

  • No encontrado

Y en el caso de fallo, diremos que el fallo puede deberse a que la cuenta ha sido bloqueada o ha ocurrido alguna excepción desconocida.

Por lo tanto, en nuestro ejemplo estamos "solicitando" datos, por lo que utilizaremos una solicitud en este caso.

Configuración de DSL

Configuración de la Respuesta y Reason Codes

En DSL 3 - Uso de una Función de Dominio, utilizamos los códigos de respuesta predeterminados "AcceptOrReject" para determinar el resultado de la llamada a la función de dominio. Aquí hemos definido un requisito ligeramente más desafiante que requiere el uso de los conceptos de código de solicitud y de respuesta.

El Response Codes

En primer lugar, consideremos los códigos de respuesta. Tenemos tres resultados: "Éxito", "Fallo" o "No encontrado". Así que añadamos estos como un nuevo conjunto de códigos de respuesta que podemos utilizar.

Si hacemos clic derecho en nuestro modelo y elegimos Nuevo  v2Flo  Biblioteca de Códigos de Respuesta, deberíamos ver esta pantalla.

external 1

Aquí podemos proporcionar el nombre de nuestra biblioteca y luego ingresar los códigos de respuesta en ella. Así que llamemos a nuestra biblioteca 'Validación de Cuentas'. Response Codes', proporcione una descripción adecuada y luego haga clic en el botón "Agregar Código de Respuesta" - esto nos mostrará una nueva tabla que contiene los códigos de respuesta. Vamos a configurarlos de la siguiente manera:

external 2

Tenga en cuenta que para las opciones "Fallido" y "No encontrado" hemos marcado la casilla de fallo. Esto indica al DSL que estos códigos de respuesta se basan en fallos y que debe almacenar las razones de fallo asociadas al pago para su análisis.

El Reason Codes

Habiendo configurado nuestros códigos de respuesta, ahora hagamos lo mismo para los códigos de razón.- es esencialmente el mismo proceso pero utilizando la biblioteca de códigos de razón en lugar de los códigos de respuesta. Si lo configura correctamente, debería verse así:

external 3
Definiciones Alternativas

En este tutorial hemos definido los resultados de la validación de cuentas como una combinación de códigos de respuesta y códigos de razón. Existen muchas maneras diferentes en las que usted puede elegir configurar su flujo, dependiendo de sus requisitos y de lo que funcione mejor para usted. Por ejemplo, también sería válido establecer un conjunto de cuatro códigos de respuesta donde 'Bloqueado' esté representado de esa manera.

Ahora que hemos configurado nuestros códigos de respuesta y de razón, configuremos el dominio externo y utilicémoslos dentro de él.

Añadiendo un Dominio Externo

El primer paso es agregar el Sistema Contable como un dominio externo, similar a cuando creamos la biblioteca de funciones de dominio. Para hacer esto, seleccione el flujo de proceso (IpftutorialFlow), haga clic derecho y luego seleccione Nuevo  v2Flo  Dominio Externo. Esto debería mostrar la siguiente vista:

external 4

Añadamos un nombre y una descripción para comenzar:

  • nombre - Sistema Contable

  • descripción - Un sistema de cuentas de muestra

Para nuestro requerimiento, vamos a ask al sistema de cuentas que valide nuestros datos, por lo que debemos modelar esto como una "Solicitud". Así que haga clic en el botón de agregar solicitud y luego proporcione:

  • una solicitud de "Validación de Cuenta"

  • una descripción de "Valida el sistema de cuentas"

  • los datos empresariales que contienen el " Customer Credit Transfer "

external 5

Esto es ahora una función que podemos llamar desde nuestro flujo, que tomará el customer transferencia de crédito que hemos recibido de la iniciación de pago y enviarla a las capacidades de validación de los sistemas contables. Tenga en cuenta que si el sistema contable tenía un formato específico que requería, podríamos definirlo aquí y utilizar el IPF.mapping capacidades para transformarse a ello. Más sobre eso más tarde..

Tenga en cuenta que, según lo anterior, podemos ver que nuestra solicitud ha sido resaltada como inválida, ya que aún no la hemos completado.

A continuación, necesitamos agregar nuestra respuesta, así que, al igual que en las funciones de dominio, presione return en la sección "Respuestas" y luego definiremos:

  • una respuesta de "Validación de Cuenta"

  • una descripción de "El mensaje de resultado del sistema contable"

  • no business data

  • un conjunto de códigos de respuesta de "Validación de Cuenta" Response Codes " ("CTRL + Space" para listar y seleccionar )

  • un conjunto de códigos de razón de "Validación de Cuenta" Reason Codes " ("CTRL + Space" para listar y seleccionar )

  • una bandera de finalización establecida en verdadero

Cuando esté completo, el dominio externo debería verse así:

external 6

Actualizando el Flujo

Habiendo creado nuestro dominio externo, necesitamos integrarlo en nuestro flujo, así que volvamos al flujo y comencemos por añadir un nuevo estado para cuando nuestra aplicación está validando la cuenta:

Estados

external 7
Consejo Principal

Para mezclar el orden de las entradas de la tabla, mantenga presionadas las teclas "Shift + Ctrl" y utilice las flechas arriba/abajo.

Events

Ahora vamos a añadir tres nuevos eventos en nuestro flujo:

  • uno para cuando la verificación pasa

  • uno para fallo

  • uno para no conocido

Normalmente hacemos esto haciendo clic en "Agregar Event " botón en el flujo y luego ingresando los detalles como se indica a continuación:

external 8

Input Behaviours

Al igual que con las funciones de dominio, el manejo de las respuestas del sistema contable se gestiona como " Input Behaviours ". Así que haga clic en el botón "Agregar Comportamiento de Entrada" y añada comportamientos de entrada para cada una de nuestras opciones, ingresando los detalles como se indica a continuación. Nuevamente, utilizaremos CTRL + ESPACIO para seleccionar la entrada de la solicitud que creamos anteriormente, luego seleccione tanto el primer código de respuesta, es decir, Aceptado, como el evento relevante "Fraude Aceptado". Repita para el código de respuesta "Rechazado" para el evento."

external 9

Finalmente, necesitamos conectar tanto la llamada al sistema de validación como la forma en que manejamos la recepción de nuestros tres eventos en el " Event Sección de "Comportamiento" del flujo.

Event Behaviours

Comencemos añadiendo la llamada a la nueva solicitud de validación. Anteriormente, al recibir la confirmación de verificación de duplicados (evento - "Se ha pasado la verificación de duplicados"), estábamos completando el flujo. Ahora cambiemos esto para que, en su lugar, pasemos a nuestro nuevo estado de "Validando Cuenta" y llamemos a la "Solicitud de Validación de Cuenta". Hacemos esto eligiendo realizar una acción y luego seleccionando nuestra solicitud. Esto debería verse como lo siguiente cuando esté completo:

external 10

Ahora está llamando a la solicitud, necesitamos manejar la respuesta. En nuestro caso, vamos a decir que el éxito va a completarse, mientras que tanto no encontrado como fallido irán a nuestro estado rechazado.

Para el caso de fallo, utilizaremos una nueva característica del comportamiento del evento que no hemos visto antes.- la capacidad de utilizar la condición "En Cualquiera De". Esto significa que podemos decir que cuando llega el evento "Cuenta No Encontrada" o el evento "Validación de Cuenta Fallida", podemos realizar la misma funcionalidad.

Hacemos esto como antes, excepto eligiendo "En Cualquiera De" del menú desplegable "Cuando". Una vez que hemos seleccionado el primero de nuestros dos eventos, simplemente presionamos retorno y luego podemos utilizar nuestro enfoque de selección normal para elegir otro.

Una vez completado, esto debería parecer:

external 11

Ahora que todo el trabajo de definición del flujo está completo, pero antes de continuar, consulte nuevamente el visor de flujos (Herramientas > Abrir Visor de Flujos) y vea nuestro nuevo diagrama.

external 12

Y como era de esperar aquí, podemos ver que ahora hemos incluido nuestra solicitud de validación de cuenta en nuestro camino exitoso.

Ahora examinamos el lado de la implementación de esto; si no está interesado en esto, puede saltar directamente al ejercicio.

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 en el directorio raíz de nuestro proyecto:

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 comunicarnos con nuestro sistema contable de la siguiente manera:

package com.iconsolutions.ipf.tutorial.adapters;

import om.iconsolutions.ipf.tutorial.actions. AccountValidationRequestAction;
import java.util.concurrent. CompletionStage;

public interface AccountingSystemActionPort {
    CompletionStage<Void> execute(AccountValidationRequestAction var1);
}

Así que, al igual que con nuestras funciones de dominio, esto es lo que necesitamos implementar para poder realizar llamadas a nuestros sistemas externos. Este es el punto en el que, en una implementación típica, usted utilizaría el marco de conectores para realizar una llamada al sistema externo a través de un protocolo (por ejemplo, kafka). Usted tratará con el marco de conectores más adelante en esta serie de tutoriales, así que por ahora utilizaremos otra característica de nuestro código generado.- la aplicación de muestra.

Primero necesitamos agregar la dependencia a la aplicación de muestra, hacemos esto añadiendo la siguiente dependencia en el pom para la ipf-tutorial-app (ipf-tutorial-app/pom.xml).

<dependency>
     <groupId>com.iconsolutions.ipf.tutorial.{solution}.domain</groupId>
     <artifactId>sampleapp</artifactId>
     <version>${project.version}</version>
</dependency>
Tenga en cuenta que la solución será la carpeta de solución en la que esté trabajando actualmente, por ejemplo, inicial sería com.iconsolutions.ipf.tutorial.domini.inicial. Si se construye desde el andamiaje, es simplemente ipftutorialsolution.

Si examinamos el proyecto de la aplicación de muestra (domain-root/sampleapp/target/generated-sources/com/iconsolutions/ipf/tutorial/ipftutorialmodel/sample_app/adapter), podemos ver implementaciones de muestra de todos nuestros puertos. Funcionalmente, todo lo que hacen es devolver el primer código de respuesta disponible, pero son suficientes para poder poner en marcha una aplicación. Esto las hace extremadamente útiles, ya que pueden ser utilizadas de inmediato para hacer funcionar nuestra aplicación y luego ser reemplazadas una por una a medida que se desarrollen implementaciones reales.

Ahora añadamos la implementación de ejemplo de AccountSystemActionPort en nuestra configuración. Hacemos esto volviendo a nuestro IpfTutorialConfig y añadiendo una línea adicional:

@Bean
public IpftutorialmodelDomain init(ActorSystem actorSystem) {
    // All adapters should be added to the domain model
    return new IpftutorialmodelDomain. Builder(actorSystem)
            .withDomainFunctionAdapter(input -> CompletableFuture.completedStage(new DuplicateCheckResponseInput. Builder(input.getId(), AcceptOrRejectCodes. Accepted).build()))
            .withAccountingSystemActionAdapter(new SampleAccountingSystemActionAdapter())
            .build();
}

Aquí podemos ver que hemos añadido una declaración para utilizar nuestro SampleAccountSystemActionAdapter.

Eso es todo lo que necesitamos hacer para añadir una implementación simple de nuestra llamada al sistema contable. En secciones posteriores proporcionaremos ejemplos más complejos y cómo podríamos utilizar el marco Icon Connector para realizar llamadas a sistemas reales.

Verificando nuestra Solución

Ahora estamos listos para ejecutar nuestra aplicación nuevamente. 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 | jq

Y finalmente, si mencionamos el pago en el Developer GUI y mencione el domain events pestaña (buscar por id de unidad de trabajo, haga clic en ver, haga clic domain events)

external 13

Aquí podemos ver que ahora tenemos tres eventos que están llegando, incluyendo nuestro nuevo "Validación de Cuenta Aprobada" como el tercer evento.

Ejercicio

Como ejercicio, añadamos otro paso a nuestro flujo. Imaginemos que necesitamos realizar una verificación de fraude como parte de nuestro flujo. Los requisitos del servicio de verificación de fraude que llamaremos son:

  • Toma un pacs008 como datos de entrada.

  • Puede devolver ya sea un aprobado o un reprobado.

  • Solo realizamos la verificación de fraude si la cuenta ha sido validada con éxito.

  • Si la verificación falla, el pago debe ser rechazado.

  • Si la verificación es exitosa, el pago debe completarse.

Adelante, intente implementar una solución para esto. Utilice el servicio de consulta para verificar que su nueva capacidad de Fraude ha sido invocada.

Cuando esté listo, puede comparar su solución con la solución "add_external_domain".

Conclusiones

En esta sección nosotros:

  • Se creó con éxito nuestro primer dominio externo, lo que nos permitió simular la realización de una llamada a un servicio de contabilidad externo.

  • configure una solicitud dentro de nuestro dominio e intégrala en nuestro comportamiento de eventos para enviar una solicitud y posteriormente recibir una respuesta del sistema de cuentas.

  • tuvo una introducción ligera a los códigos de respuesta.

Ahora que ha configurado nuestra aplicación para realizar llamadas a un servicio externo, descubramos cómo utilizar la lógica de enrutamiento en nuestros flujos a través de:xref:add_decision.adoc[DSL 5 - Utilizando una decisión]