DSL 4 - Uso de un Dominio Externo
|
Iniciando
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 permite 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 el valor predeterminado "AcceptOrReject" response codes 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 código de respuesta.
El Response Codes
Primero, consideremos el response codes. Tenemos tres resultados: "Éxito", "Fallo" o "No encontrado". Por lo tanto, añadamos estos como un nuevo conjunto de códigos de respuesta que podemos utilizar.
Si hacemos clic derecho en nuestro modelo y elegimos , deberíamos ver esta pantalla.
Aquí podemos proporcionar el nombre de nuestra biblioteca y luego ingresar el response codes dentro de. 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 el response codes. Establezcamoslos de la siguiente manera:
Tenga en cuenta aquí que para el " Failed "y" las opciones "No encontrado" hemos registrado el fallo en la caja. Esto le indica al DSL que estos response codes son basados en fallos y que debe almacenar las razones de los fallos asociadas al pago para su análisis.
El Reason Codes
Habiendo configurado nuestro response codes, ahora hagamos lo mismo para el reason codes-es esencialmente el mismo proceso pero utilizando la biblioteca de códigos de razón en lugar de response codes. Si lo configura correctamente, debería verse así:
|
Definiciones Alternativas
En este tutorial hemos definido los resultados de la validación de cuentas como una combinación de respuesta y reason codes. 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, igualmente válido sería configurar un conjunto de cuatro response codes donde 'Bloqueado' también se representa de esa manera. |
Ahora hemos configurado nuestra respuesta y reason codes, configure el dominio externo y utilícelo dentro de él.
Añadiendo un Dominio Externo
El primer paso es agregar el Sistema de Contabilidad como un dominio externo, similar a cuando creamos la biblioteca de funciones de dominio. Para hacer esto, seleccionamos el process flow(IpftutorialFlow) y haga clic derecho, luego seleccione . Esto debería mostrar la siguiente vista:
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"
-
el business data conteniendo el " Customer Credit Transfer "
Esto es ahora una función que podemos llamar desde nuestro flujo, que tomará el customer credit transfer hemos recibido de la iniciación de pago y lo enviamos 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, como se mencionó anteriormente, 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 como domain functions, presione retorno en la sección "Respuestas" y luego definiremos:
-
un nombre de "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)
-
a completar flag establecer en verdadero
Cuando esté completo, el dominio externo debería verse así:
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
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 events en nuestro flujo:
-
uno para cuando el cheque 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:
Input Behaviours
Como con domain functions, el manejo de las respuestas del sistema contable se maneja como " Input Behaviours ". Así que hagamos clic en el botón "Agregar Comportamiento de Entrada" y agreguemos" input behaviours para cada una de nuestras opciones y luego ingresando los detalles como se indica a continuación. Nuevamente, utilizaremos CTRL + ESPACIO para seleccionar la entrada de la solicitud que creamos anteriormente, luego seleccionaremos tanto el primer código de respuesta, es decir, Aceptado, como el relevante.event "Fraude OK". Repita para el código de respuesta "Rechazado" para event
Finalmente, necesitamos conectar tanto la llamada al sistema de validación como la forma en que manejamos la recepción de nuestros tres events into the " 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 (event - "Se ha superado la verificación de duplicados"), estábamos completando el flujo. Ahora cambiemos esto para que en su lugar pasemos a nuestra nueva "Validación de Cuenta" state y llame 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 se complete:
Ahora está llamando a la solicitud, necesitamos manejar la respuesta. En nuestro caso, vamos a decir que el éxito se considera completo mientras que tanto no encontrado como failed irá a nuestro rechazado state.
Para el caso de fallo, utilizaremos una nueva función del event comportamiento que no hemos visto antes-la capacidad de utilizar la condición "En Cualquiera De". Esto significa que podemos decir cuando ya sea "Cuenta No Encontrada" o "Validación de Cuenta" Failed " event llega, podemos realizar la misma funcionalidad.
Hacemos esto igual que antes, excepto eligiendo "En Cualquiera De" del menú desplegable "Cuando". Una vez que hemos seleccionado el primero de nuestros dos events, simplemente presionamos la tecla de retorno y luego podemos utilizar nuestro enfoque de selección normal para elegir otro.
Una vez completado, esto debería parecer:
Ahora ha finalizado todo el trabajo de definición del flujo, pero antes de continuar, por favor abra nuevamente el visor de flujos (Herramientas > Abrir Visor de Flujos) y vea nuestro nuevo diagrama.
Y como se esperaba 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, puede nuevamente observar el código generado en /domain-root/domain/target, y ahora debería encontrar el puerto para comunicarse 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 nuestro domain functions, 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, utilizaríamos 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.inicial.dominio. Si se construye desde el scaffolder 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 los hace extremadamente útiles, ya que pueden ser utilizados de inmediato para hacer funcionar nuestra aplicación y luego ser reemplazados uno por uno a medida que se desarrollan implementaciones reales.
Ahora añadamos la implementación de ejemplo de AccountSystemActionPort en nuestra configuración. Hacemos esto volviendo a nuestra 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 agregar 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. Comencemos a iniciar la aplicación como 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 | jq
Y finalmente, si mencionamos el pago en el Developer GUI y mencione el domain events tab (buscar por unit of work id, haga clic en ver, haga clic domain events)
Aquí podemos ver que ahora tenemos tres events viniendo a través, incluyendo nuestra nueva "Validación de Cuenta Aprobada" como la tercera event.
Ejercicio
Como ejercicio, añadamos otro paso a nuestro flujo. Imaginemos que necesitamos realizar un chequeo de fraude como parte de nuestro flujo. Los requisitos del servicio de chequeo de fraude que llamaremos son:
-
Toma un pacs008 como datos de entrada.
-
Puede devolver 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égrelo en nuestro event comportamiento para enviar una solicitud y posteriormente recibir una respuesta del sistema de cuentas.
-
tuvo una introducción ligera a response codes!
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]