PaperProgressStatusEventDto events onto an inbound queue. A listener dispatches each event to a typed MessageHandler based on the status code. Handlers either record intermediate data, forward the event to pn-delivery-push, or do both in sequence.
Architecture overview
HandlersFactory is a Spring @Component that initialises a ConcurrentHashMap<String, MessageHandler> at startup via @PostConstruct. If no handler is registered for a given status code, LogMessageHandler is used as a no-op fallback.
Handler types
MessageHandler
MessageHandler
The root interface. All handlers implement
Mono<Void> handleMessage(PnDeliveryRequest entity, PaperProgressStatusEventDto paperRequest).LogMessageHandler
LogMessageHandler
No-op handler used as the fallback for unregistered status codes. It logs the event and returns immediately.
ChainedMessageHandler
ChainedMessageHandler
Executes a list of
MessageHandler instances sequentially using Flux.fromIterable(handlers).concatMap(...). Used to compose multi-step processing pipelines.SaveMetadataMessageHandler
SaveMetadataMessageHandler
Persists the event into
EventMetaDAO for later retrieval by aggregator handlers. Optionally forwards the event to pn-delivery-push when the SendProgressMeta feature flag (isMetaEnabled()) is active.SaveDematMessageHandler
SaveDematMessageHandler
Persists digital document (demat) data into
EventDematDAO. Used for events carrying scanned attachments.AggregatorMessageHandler
AggregatorMessageHandler
Handles final status codes that require enrichment with pre-closing metadata. It:
- Reads the correlated pre-closing
PnEventMetarecord fromEventMetaDAO. - Enriches the incoming event with
deliveryFailureCauseanddiscoveredAddress. - Forwards the enriched event to pn-delivery-push via
SendToDeliveryPushHandler. - Cleans up
METAandDEMATrows for the request viaMetaDematCleaner.
CustomAggregatorMessageHandler
CustomAggregatorMessageHandler
A specialised aggregator for events like
RECAG003C that require custom aggregation logic.SendToDeliveryPushHandler
SendToDeliveryPushHandler
Pushes the event directly to the pn-delivery-push SQS queue. Used for progress events that need no prior metadata.
SendToOcrProxyHandler
SendToOcrProxyHandler
A proxy that routes events to an OCR processing queue when the driver is configured for OCR, and falls back to a wrapped
MessageHandler otherwise. Used for RECRN001C, RECRN002C, RECRN002F, RECRN003C, RECRN004C, and RECRN005C.RetryableErrorMessageHandler
RetryableErrorMessageHandler
Handles transient errors by retrying the External Channel send request. Used for codes like
RECRS006, RECRN006, and RECAG004.NotRetryableErrorMessageHandler
NotRetryableErrorMessageHandler
Handles permanent errors by recording the failure and notifying pn-delivery-push. Used for
CON997, CON998, CON995, and CON993.NotRetriableWithoutSendErrorMessageHandler
NotRetriableWithoutSendErrorMessageHandler
Records the error in
PaperRequestErrorDAO without sending any event to pn-delivery-push. Used for P008–P014.ProxyCON996MessageHandler
ProxyCON996MessageHandler
Routes
CON996 (postal code not covered) to either RetryableErrorMessageHandler or NotRetryableErrorMessageHandler depending on the pn.paper-channel.enable-retry-con996 flag.Proxy890MessageHandler
Proxy890MessageHandler
Routes 890-family final events (
RECAG005C–RECAG008C) to one of: RECAG008CMessageHandler, Complex890MessageHandler, or Simple890MessageHandler, based on configuration.PNAG012MessageHandler
PNAG012MessageHandler
Handles the
PNAG012 storage-in-progress (compiuta giacenza) event for both 890 and AR flows.RECAG011A/BMessageHandler
RECAG011A/BMessageHandler
Handle the two-step 890 storage notification sequence.
RECAG011A saves metadata; RECAG011B saves demat data and may trigger PNAG012.RECAG012MessageHandler
RECAG012MessageHandler
Saves
RECAG012 metadata and posts simplified post-logic. Optionally sends RECAG012A when the isRECAG012AEnabled() flag is active.RECAG008CMessageHandler
RECAG008CMessageHandler
Handles the final 890 delivery outcome, cleaning up meta/demat data and forwarding to pn-delivery-push.
RECRN003C/004C/005CMessageHandler
RECRN003C/004C/005CMessageHandler
Handle final AR delivery outcomes with OCR proxy support.
RECRN011MessageHandler
RECRN011MessageHandler
Handles the
RECRN011 storage-in-progress event for AR deliveries.Status code → handler mapping
RECAG family (Legge 890/1982 — raccomandata giudiziaria)
| Status code | Handler | Description |
|---|---|---|
RECAG001A | SaveMetadataMessageHandler | 890 progress: in transit |
RECAG001B | SaveDematMessageHandler | 890 demat: in transit |
RECAG001C | AggregatorMessageHandler | 890 final: in transit |
RECAG002A | SaveMetadataMessageHandler | 890 progress: delivery attempt |
RECAG002B | SaveDematMessageHandler | 890 demat: delivery attempt |
RECAG002C | AggregatorMessageHandler | 890 final: delivery attempt |
RECAG003A | SaveMetadataMessageHandler | 890 progress: not delivered |
RECAG003B | SaveDematMessageHandler | 890 demat: not delivered |
RECAG003C | CustomAggregatorMessageHandler | 890 final: not delivered (custom) |
RECAG003D | SaveMetadataMessageHandler | 890 progress: not delivered (variant) |
RECAG003E | SaveDematMessageHandler | 890 demat: not delivered (variant) |
RECAG003F | AggregatorMessageHandler | 890 final: not delivered (variant) |
RECAG004 | RetryableErrorMessageHandler | 890 retryable error |
RECAG005A | SaveMetadataMessageHandler | 890 progress: storage pending |
RECAG005B | ChainedMessageHandler (SaveDemat + SimplifiedPostLogic) | 890 demat: storage |
RECAG005C | Proxy890MessageHandler | 890 final: storage |
RECAG006A | SaveMetadataMessageHandler | 890 progress: delivered to post office |
RECAG006B | ChainedMessageHandler (SaveDemat + SimplifiedPostLogic) | 890 demat: delivered to post office |
RECAG006C | Proxy890MessageHandler | 890 final: delivered to post office |
RECAG007A | SaveMetadataMessageHandler | 890 progress: returned to sender |
RECAG007B | ChainedMessageHandler (SaveDemat + SimplifiedPostLogic) | 890 demat: returned to sender |
RECAG007C | Proxy890MessageHandler | 890 final: returned to sender |
RECAG008A | SaveMetadataMessageHandler | 890 progress: compiuta giacenza |
RECAG008B | ChainedMessageHandler (SaveDemat + SimplifiedPostLogic) | 890 demat: compiuta giacenza |
RECAG008C | Proxy890MessageHandler | 890 final: compiuta giacenza |
RECAG010 | SendToDeliveryPushHandler | 890 progress: inesito |
RECAG011A | RECAG011AMessageHandler | 890 storage in-progress: meta |
RECAG011B | RECAG011BMessageHandler | 890 storage in-progress: demat |
RECAG012 | ChainedMessageHandler (RECAG012 + SimplifiedPostLogic [+ RECAG012A]) | 890 registered mail receipt |
RECAG013 | RetryableErrorMessageHandler | 890 retryable error (variant) |
RECAG015 | SendToDeliveryPushHandler | 890 progress: in transit (variant) |
RECRN family (raccomandata normale — AR/RS)
| Status code | Handler | Description |
|---|---|---|
RECRN001A | SaveMetadataMessageHandler | AR/RS progress: in transit |
RECRN001B | SaveDematMessageHandler | AR/RS demat: in transit |
RECRN001C | SendToOcrProxyHandler (wraps AggregatorMessageHandler) | AR/RS final: in transit |
RECRN002A | SaveMetadataMessageHandler | AR/RS progress: delivery attempt |
RECRN002B | SaveDematMessageHandler | AR/RS demat: delivery attempt |
RECRN002C | SendToOcrProxyHandler (wraps CustomAggregatorMessageHandler) | AR/RS final: not delivered |
RECRN002D | SaveMetadataMessageHandler | AR/RS progress: not delivered |
RECRN002E | SaveDematMessageHandler | AR/RS demat: not delivered |
RECRN002F | SendToOcrProxyHandler (wraps AggregatorMessageHandler) | AR/RS final: not delivered (variant) |
RECRN003A | SaveMetadataMessageHandler | AR/RS progress: storage pending |
RECRN003B | SaveDematMessageHandler | AR/RS demat: storage pending |
RECRN003C | SendToOcrProxyHandler (wraps RECRN003CMessageHandler) | AR/RS final: delivered at post office |
RECRN004A | SaveMetadataMessageHandler | AR/RS progress: compiuta giacenza |
RECRN004B | SaveDematMessageHandler | AR/RS demat: compiuta giacenza |
RECRN004C | SendToOcrProxyHandler (wraps RECRN004CMessageHandler) | AR/RS final: compiuta giacenza |
RECRN005A | SaveMetadataMessageHandler | AR/RS progress: returned to sender |
RECRN005B | SaveDematMessageHandler | AR/RS demat: returned to sender |
RECRN005C | SendToOcrProxyHandler (wraps RECRN005CMessageHandler) | AR/RS final: returned to sender |
RECRN006 | RetryableErrorMessageHandler | AR/RS retryable error |
RECRN010 | SaveMetadataMessageHandler | AR/RS progress: delivery info |
RECRN011 | RECRN011MessageHandler | AR/RS storage in-progress |
RECRN013 | RetryableErrorMessageHandler | AR/RS retryable error (variant) |
RECRN015 | SendToDeliveryPushHandler | AR/RS progress |
RECRS family (raccomandata semplice)
| Status code | Handler | Description |
|---|---|---|
RECRS001C | SendToDeliveryPushHandler | RS final: delivered |
RECRS002A | SaveMetadataMessageHandler | RS progress |
RECRS002B | SaveDematMessageHandler | RS demat |
RECRS002C | AggregatorMessageHandler | RS final |
RECRS002D | SaveMetadataMessageHandler | RS progress (variant) |
RECRS002E | SaveDematMessageHandler | RS demat (variant) |
RECRS002F | AggregatorMessageHandler | RS final (variant) |
RECRS003C | SendToDeliveryPushHandler | RS final: returned to sender |
RECRS004A | SaveMetadataMessageHandler | RS progress: storage |
RECRS004B | SaveDematMessageHandler | RS demat: storage |
RECRS004C | AggregatorMessageHandler | RS final: storage |
RECRS005A | SaveMetadataMessageHandler | RS progress: compiuta giacenza |
RECRS005B | SaveDematMessageHandler | RS demat: compiuta giacenza |
RECRS005C | AggregatorMessageHandler | RS final: compiuta giacenza |
RECRS006 | RetryableErrorMessageHandler | RS retryable error |
RECRS010 | SendToDeliveryPushHandler | RS progress: inesito |
RECRS013 | RetryableErrorMessageHandler | RS retryable error (variant) |
RECRS015 | SendToDeliveryPushHandler | RS progress |
RECRI / RECRSI family (international)
| Status code | Handler | Description |
|---|---|---|
RECRI001 | SendToDeliveryPushHandler | International progress |
RECRI002 | SendToDeliveryPushHandler | International progress |
RECRI003A | SaveMetadataMessageHandler | International progress |
RECRI003B | SaveDematMessageHandler | International demat |
RECRI003C | AggregatorMessageHandler | International final |
RECRI004A | SaveMetadataMessageHandler | International progress |
RECRI004B | SaveDematMessageHandler | International demat |
RECRI004C | AggregatorMessageHandler | International final |
RECRI005 | RetryableErrorMessageHandler | International retryable error |
RECRSI003C | SendToDeliveryPushHandler | International simple final |
RECRSI004A | SaveMetadataMessageHandler | International simple progress |
RECRSI004B | SaveDematMessageHandler | International simple demat |
RECRSI004C | AggregatorMessageHandler | International simple final |
RECRSI005 | RetryableErrorMessageHandler | International simple retryable error |
CON family (connection / system events)
| Status code | Handler | Description |
|---|---|---|
CON080 | SendToDeliveryPushHandler | Progress: sent to External Channel |
CON018 | SendToDeliveryPushHandler | Progress (when isCON018Enabled()) |
CON020 | SendToDeliveryPushHandler | Progress (when sendCon020=true) |
CON993 | NotRetryableErrorMessageHandler | Non-retryable error |
CON995 | NotRetryableErrorMessageHandler | Non-retryable error |
CON996 | ProxyCON996MessageHandler | CAP not covered (retry or non-retryable) |
CON997 | NotRetryableErrorMessageHandler | Non-retryable error |
CON998 | NotRetryableErrorMessageHandler | Non-retryable error |
PNAG / P family
| Status code | Handler | Description |
|---|---|---|
PNAG012 | PNAG012MessageHandler | Compiuta giacenza (storage) for 890 and AR |
P008–P014 | NotRetriableWithoutSendErrorMessageHandler | Non-retryable errors, no event sent to delivery-push |
ToggleableQueueListener
ToggleableQueueListener is a @Configuration class that activates only when pn.paper-channel.enable-prepare-phase-one=true. It listens on the ${pn.paper-channel.queue-normalize-address} SQS queue and dispatches three internal event types:
| Event type | Handler method | Description |
|---|---|---|
PREPARE_ASYNC_FLOW | handlePreparePhaseOneAsyncFlowEvent | Starts phase-1 address normalization |
NATIONAL_REGISTRIES_ERROR | handleNationalRegistriesErrorEvent | Retries National Registry lookup up to attemptQueueNationalRegistries times |
ADDRESS_MANAGER_ERROR | handleAddressManagerErrorEventFromPreparePhaseOne | Retries Address Manager normalization up to attemptQueueAddressManager times |
When
pn.paper-channel.enable-prepare-phase-one=false, this listener is not registered and the legacy PrepareAsyncServiceImpl handles the full flow instead.Outgoing events to pn-delivery-push
SqsSender publishes two event types to pn-delivery-push:
| Event type | Trigger | Content |
|---|---|---|
PrepareEvent | End of successful Prepare phase | requestId, resolved address, StatusCodeEnum.OK or KO, optional KOReason |
PaperChannelUpdate containing SendEvent | Progress events from External Channel | Status code, delivery details, optional discoveredAddress |
pn-service-desk (detected by PREFIX_REQUEST_ID_SERVICE_DESK in the requestId), events are sent to EventBridge instead of SQS via sqsSender.pushPrepareEventOnEventBridge().