Skip to main content

Maquina de estados

4.3 Orquestación vs. Coreografía

Se opta por un enfoque de orquestación para la máquina de estados dentro del Módulo de Integración de SPPD.
La máquina de estados centraliza la lógica de control del ciclo de vida de cada transacción de sincronización originada en SPPD.

Funcionalidades que incluye:

  • 🚀 Iniciar el envío del mensaje
  • ⏳ Esperar y procesar la respuesta de Power Street
  • ⏱️ Manejar timeouts si no se recibe respuesta
  • 🔁 Gestionar la lógica de reintentos
  • ❗ Transitar la transacción a estados de fallo que requieran intervención manual
  • 🛠️ Manejar el reseteo de reintentos y el reenvío de mensajes corregidos

Esta orquestación interna en SPPD proporciona:

  • Un control más granular
  • Mejor visibilidad sobre el estado de cada transacción
  • Soporte para el dashboard de operaciones
  • Capacidad de intervención manual cuando sea necesario

🔄 Nota: El patrón general entre SPPD y Power Street sigue siendo de coreografía (cada sistema reacciona a eventos en el broker),
pero el manejo interno de la transacción en SPPD es orquestado para garantizar robustez y trazabilidad.

5. Máquina de Estados (Spring State Machine para SPPD)

5.1 Introducción al Modelo de Estados

La máquina de estados controlará el ciclo de vida de cada transacción de sincronización de producto en el sistema SPPD.


🧠 Especificación Detallada de la Máquina de Estados (SPPD) - AJUSTADA


#### 5.2 Catálogo de Estados

EstadoDescripción
NEWTransacción recién creada, pendiente de validación inicial.
PENDING_PUBLISHTransacción validada, lista para ser publicada o republicada en el Message Broker.
FATAL_ERRORError irrecuperable durante la validación inicial o un fallo crítico. Estado final.
MESSAGE_PUBLISHEDMensaje enviado al Message Broker. Esperando respuesta de Power Street o timeout.
PROCESSING_RESPONSERespuesta recibida de Power Street, se está evaluando.
RETRYABLE_FAILUREOcurrió un error reintentable (fallo de envío, timeout o error reintentable de Power Street), y aún quedan intentos o se está evaluando.
PENDING_RETRY_PUBLISHProgramada para un reintento, esperando que se cumpla el intervalo de espera.
MAX_RETRIES_REACHEDSe alcanzó el número máximo de reintentos o Power Street reportó un error fatal. Requiere intervención manual.
MANUAL_CORRECTION_PENDING_PUBLISHUn operador ha editado el payload; la transacción está lista para ser republicada.
COMPLETED_SUCCESSPower Street procesó la transacción exitosamente. Estado final.
COMPLETED_SUCCESS_CORRECTEDPower Street procesó exitosamente después de una corrección manual. Estado final.

5.3 Catálogo de Eventos Externos

EventoDesencadenante
EV_PUBLISH_REQUESTEDSPPD Core solicita la sincronización de un producto.
EV_VALIDATION_SUCCESS(Puede ser un evento interno o resultado de una acción) Validación interna del payload es exitosa.
EV_VALIDATION_FAILURE(Puede ser un evento interno o resultado de una acción) Validación interna del payload falla.
EV_MESSAGE_SENT_TO_BROKER_FAILEl publicador interno de SPPD no pudo enviar el mensaje al Message Broker.
EV_RESPONSE_RECEIVEDSe recibe un mensaje de respuesta desde Power Street.
EV_RESPONSE_TIMEOUTExpiró el tiempo de espera para recibir una respuesta de Power Street.
EV_PROCESS_RESPONSE_SUCCESS(Evento interno generado por la acción storeRawResponse si la respuesta fue éxito)
EV_PROCESS_RESPONSE_ERROR_RETRY(Evento interno generado por la acción storeRawResponse si la respuesta fue error reintentable)
EV_PROCESS_RESPONSE_ERROR_FATAL(Evento interno generado por la acción storeRawResponse si la respuesta fue error fatal de Power Street)
EV_RETRY_TIMER_EXPIREDEl temporizador para el intervalo de reintento ha expirado.
EV_MANUAL_CORRECTION_APPLIEDUn operador ha guardado cambios en una transacción desde el dashboard.

🔄 Transiciones y Acciones (Alineado con el Diagrama)

Desde EstadoEventoHacia EstadoGuardia / CondiciónAcción(es) de Transición / Salida / Entrada
[*] (Inicio)EV_PUBLISH_REQUESTEDNEWEntrada a NEW: initializeTransaction(payload, metadata)
NEWEV_VALIDATION_SUCCESSPENDING_PUBLISHAcción: prepareInitialMessage()
NEWEV_VALIDATION_FAILUREFATAL_ERRORAcción: logValidationError(), updateTransactionStatus(FATAL_ERROR)
PENDING_PUBLISH (on entry)MESSAGE_PUBLISHEDAcción de Entrada: incrementRetryAttempt(), publishMessageToBroker(), startResponseTimer(), updateTransactionStatus(MESSAGE_PUBLISHED)
PENDING_PUBLISHEV_MESSAGE_SENT_TO_BROKER_FAILRETRYABLE_FAILUREAcción: logBrokerPublishError(), updateTransactionStatus(RETRYABLE_FAILURE)
Entrada a RETRYABLE_FAILURE: checkRetryLimitAndDetermineNextStep()
MESSAGE_PUBLISHEDEV_RESPONSE_RECEIVEDPROCESSING_RESPONSEAcción: stopResponseTimer(), storeRawResponseAndDetermineInternalEvent() (genera eventos internos)
MESSAGE_PUBLISHEDEV_RESPONSE_TIMEOUTRETRYABLE_FAILUREAcción: logResponseTimeout(), updateTransactionStatus(RETRYABLE_FAILURE)
Entrada a RETRYABLE_FAILURE: checkRetryLimitAndDetermineNextStep()
PROCESSING_RESPONSEEV_PROCESS_RESPONSE_SUCCESSCOMPLETED_SUCCESS!transaction.isCorrectedAcción: parseSuccessResponse(), updateTransactionStatus(COMPLETED_SUCCESS), notifySPPDCore()
PROCESSING_RESPONSEEV_PROCESS_RESPONSE_SUCCESSCOMPLETED_SUCCESS_CORRECTEDtransaction.isCorrectedAcción: parseSuccessResponse(), updateTransactionStatus(COMPLETED_SUCCESS_CORRECTED), markAsCorrectedInDBComplete(), notifySPPDCore()
PROCESSING_RESPONSEEV_PROCESS_RESPONSE_ERROR_RETRYRETRYABLE_FAILUREAcción: parseErrorResponse(), logRetryableErrorFromPS(), updateTransactionStatus(RETRYABLE_FAILURE)
Entrada a RETRYABLE_FAILURE: checkRetryLimitAndDetermineNextStep()
PROCESSING_RESPONSEEV_PROCESS_RESPONSE_ERROR_FATALMAX_RETRIES_REACHEDAcción: parseErrorResponse(), logFatalErrorFromPS(), updateTransactionStatus(MAX_RETRIES_REACHED), notifyOperatorDashboard()
RETRYABLE_FAILURE (on entry)PENDING_RETRY_PUBLISH(si es elegible para retry)Acción de Entrada: scheduleRetryTimer(), updateTransactionStatus(PENDING_RETRY_PUBLISH)
RETRYABLE_FAILURE (on entry)MAX_RETRIES_REACHED(si NO es elegible para retry)Acción de Entrada: notifyOperatorDashboard(), updateTransactionStatus(MAX_RETRIES_REACHED)
PENDING_RETRY_PUBLISHEV_RETRY_TIMER_EXPIREDPENDING_PUBLISHAcción: prepareRetryMessage() (La entrada a PENDING_PUBLISH se encarga del resto)
MAX_RETRIES_REACHEDEV_MANUAL_CORRECTION_APPLIEDMANUAL_CORRECTION_PENDING_PUBLISHAcción: resetRetryAttempt(), updatePayloadFromCorrection(correctedPayload), logOperatorCorrectionDetails(), updateTransactionStatus(MANUAL_CORRECTION_PENDING_PUBLISH)
MANUAL_CORRECTION_PENDING_PUBLISH (on entry)PENDING_PUBLISHAcción de Entrada: markTxAsPendingCorrectedPublish() (La entrada a PENDING_PUBLISH se encarga de la publicación)
COMPLETED_SUCCESS[*] (Fin)
COMPLETED_SUCCESS_CORRECTED[*] (Fin)
FATAL_ERROR