¿Cómo puedo protegerme contra el procesamiento de respuestas duplicadas en mi dominio?

Por defecto, el puerto del dominio externo que proporciona el dominio viene incluido con soporte de reintentos configurable. Para asegurar que los reintentos no sean interpretados como respuestas independientes del dominio externo, el puerto aprovechará el inputId y physicalMessageId tupla a:

  • hacer cumplir la idempotencia-diferenciar entre el reprocesamiento de mensajes (es decir, el mismo mensaje se consume dos veces) y las presentaciones duplicadas (es decir, se consumen dos mensajes diferentes que ambos tienen el mismo inputId).

El inputId representa un identificador de negocio único (desde la perspectiva del flujo) para la respuesta de un dominio externo, y funciona como la referencia principal para las verificaciones de idempotencia. Si no se especifica, se establece como un UUID aleatorio por el puerto.

El physicalMessageId representa un identificador de transporte único de la respuesta de un dominio externo y permite al sistema distinguir entre el reprocesamiento de mensajes y las presentaciones duplicadas. Si no se especifica, se establece como un UUID aleatorio por el puerto.

Al utilizar el marco de conector IPF, los mensajes de todos los brokers compatibles receive connector los transportes contendrán un adecuado physicalMessageId dentro de su ReceivingContext objeto, que puede ser utilizado para completar la entrada.

Si el flujo recibe dos entradas con el mismo inputId, la segunda entrada siempre omitirá la ejecución y resultará en un Done. Result. EXECUTED or a Done. Result. DUPLICATE resultado, dependiendo de la physicalMessageId. Si el physicalMessageId también es el mismo en ambas entradas, la segunda entrada se trata como un mensaje reprocesado y un Done. Result. EXECUTED se devuelve. De lo contrario, la entrada se trata como una presentación duplicada, y un Done. Result. DUPLICATE is returned.

Aunque los valores predeterminados asignados por el puerto para el inputId y physicalMessageId proporcione una protección de idempotencia adecuada para la mayoría de los escenarios, hay algunos casos límite, como cuando su flujo maneja el mismo tipo de entrada desde múltiples estados no exclusivos, que requerirán que usted especifique al menos un inputId para prevenir el reprocesamiento de mensajes o envíos duplicados que activen incorrectamente una transición de flujo. A continuación se proporciona un ejemplo de cómo hacerlo:

 XYZDomain.externalDomainPort().handle(new ExternalDomainResponseInput
    .Builder(id, ExternalDomainResponseCodes. OK)
    .withInputId(someInputIdFromResponseMessage)
    .build());