Skip to content

06 — Errored Messages (DLQ equivalent)

Mirth Connect “Message Browser with Status = Errored” filter. There is no dedicated DLQ screen in Mirth; the errored-message view is the closest thing.

What this screen shows in Mirth

In Mirth, “errored messages” are surfaced as a filter on the standard Message Browser (04-message-browser.md) — you uncheck Sent/Filtered/Queued and leave only Errored. The list then shows:

  • All messages where at least one destination errored
  • Sorted desc by error timestamp by default
  • Columns: sequence #, received timestamp, channel, connector that errored, error class (e.g. ConnectException, JavaScriptException), brief error string

Above the list is a small toolbar with the actions that distinguish this from a regular browse:

  • Reprocess — re-runs the entire message through the channel pipeline, starting at the source connector. Effectively “replay from scratch.”
  • Send — re-sends just to the destination that errored, skipping the source/transformer stages. (Confusing — operators frequently pick the wrong one.)
  • Remove — delete the message from history (rare; usually retention does this).
  • Mark as Processed — clears the error status without re-running anything, used when an operator has manually resolved out-of-band.

Selecting a row populates the same bottom detail panel as 05-message-detail.md, with the Errors tab opened by default.

The list is not aggregated — if the same upstream message keeps failing the same way, you see one row per failure attempt. Mirth has no built-in “group identical errors” view.

What we’re adapting

Our DLQ view at /dlq (or /errors) is a first-class screen, not a filter on Messages. It should:

  • Show a list of failed deliveries, with optional grouping by error fingerprint (same error class + same destination + last hour) so an operator can see “23 failures of the same type” rather than 23 individual rows. Group expand-collapses to show individual entries.
  • Per-row: timestamp of failure, source interface, subscription that failed, HTTP status / error class, brief error message (truncated), retry count
  • Provide a single, unambiguous Replay action per row (and on selected rows in bulk) — no “Reprocess vs Send” confusion. Replay always means “try to deliver this again from the parsed payload.”
  • Provide a Discard action — explicitly remove from DLQ; logged in audit trail (#407).
  • Filterable by interface, subscription, error class, time range.
  • Each row drills into the same Message Detail view (#402) with the Errors tab open.

What we’re explicitly NOT copying

  • The “Reprocess vs Send” duality. We have one Replay action with clear semantics (“retry delivery to the failed subscription[s] using the parsed payload we already have”).
  • The “Mark as Processed” no-op action. Either you Replay it (and it succeeds, or fails again), or you Discard it. There’s no in-between.
  • The “errors are a filter on messages” framing. DLQ is its own page in our product because it’s a different operator workflow (the workflow that follows the page on-call sees in PagerDuty).
  • The flat, ungrouped error list. Grouping by error fingerprint is the single biggest improvement we can make over Mirth.

Which ticket implements our equivalent

#403 (UI: DLQ viewer with replay + delete). Secondary readers: #404 (subscription delivery history — shares the “row-per-failed-attempt” shape) and #407 (audit log — every Replay and Discard from this page must produce an audit entry).