withholdAcknowledgement

fun MessageExchange<*, *>.withholdAcknowledgement(withheldBy: String = getFunction()?.let { "${it.processorName}.${it.name}" } ?: "unknown")

Leaves this exchange unacknowledged when its processing ends, so a bus that redelivers unacknowledged messages delivers it again. For a processing failure that was neither handled nor durably recorded, for example when recording an event-processing failure for compensation fails.

Set on a per-function event exchange, it applies to the event stream exchange that function belongs to; the other functions of that stream still run. withheldBy names who withheld it (by default the exchange's function) for the log line.

Whether and when the message is delivered again is the bus's behaviour:

  • Redis Streams: the entry stays pending and is re-claimed and redelivered.

  • Kafka: one Wow receiver is one consumer for all the aggregate topics of its dispatcher. Commits stop at this offset; after maxDeferredCommits further acknowledgements the whole receiver (every subscribed aggregate and partition) stops polling until a restart or rebalance redelivers from this offset, and every later rebalance of that consumer waits the full maxDelayRebalance (60 s by default) for it.

  • In-memory buses and locally handled (local-first) messages: not redelivered.