aeron-io/aeron · error · IllegalArgumentException

image.correlationId=

Error message

image.correlationId={responseCorrelationId} did not request a response channel

What it means

A response channel request supplied a response-correlation-id, but no image with that correlation id has send-response-setup enabled, i.e. the referenced image never requested a response channel. The driver throws IllegalArgumentException because the response publication would have nothing valid to respond to.

Solutions

  1. Use the correlationId from the Image whose hasSendResponseSetup() is true (delivered via the image available handler) as response-correlation-id.
  2. Ensure the originating subscription channel was created with control-mode=response so images carry send-response-setup.
  3. Do not cache response correlation ids across sessions; capture them per connection event.
  4. Verify you are using the image correlationId, not the publication or subscription correlationId.

Example fix

// before
long respId = publication.registrationId();
String uri = "aeron:udp?control-mode=response|response-correlation-id=" + respId;
// after
aeron.addSubscription(subUri, stream, image -> {
  long respId = image.correlationId(); // image has send-response-setup
  String uri = "aeron:udp?control-mode=response|response-correlation-id=" + respId;
}, null);
Defensive patterns

Strategy: validation

Validate before calling

if (!image.hasSendResponseSetup())
  throw new IllegalStateException("image " + image.correlationId() + " cannot be used as a response target");
long respId = image.correlationId();

Type guard

boolean canRespond(Image image) {
  return image.hasSendResponseSetup();
}

Try / catch

try { aeron.addPublication(responseUri, streamId); }
catch (IllegalArgumentException e) { if (e.getMessage().contains("did not request a response channel")) { /* re-fetch correlation id from a send-response-setup image */ } else throw e; }

Prevention

When it happens

Trigger: Setting response-correlation-id to the correlationId of an ordinary image (created without a control-mode=response subscription) when building a response publication; stale/reused correlation ids from a previous connection.

Common situations: Implementing Aeron's response-channel RPC pattern with the correlation id captured from the wrong image or an old session; using the publication correlationId instead of the image correlationId; ids cached across reconnects.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of aeron-io/aeron@6d60124e15 (2026-09-12). Data as JSON: /api/errors/59a0714a31ae4e73. Report an issue: GitHub.

Appendix: source

Thrown at aeron-driver/src/main/java/io/aeron/driver/DriverConductor.java:2787

                    "control-mode=response was specified, but no response-correlation-id set");
            }

            if (PROTOTYPE_VALUE_CORRELATION_ID == params.responseCorrelationId)
            {
                return null;
            }

            for (final PublicationImage publicationImage : publicationImages)
            {
                if (publicationImage.correlationId() == params.responseCorrelationId)
                {
                    if (publicationImage.hasSendResponseSetup())
                    {
                        return publicationImage;
                    }
                    else
                    {
                        throw new IllegalArgumentException(
                            "image.correlationId=" + params.responseCorrelationId +
                                " did not request a response channel");
                    }
                }
            }

            throw new IllegalArgumentException("image.correlationId=" + params.responseCorrelationId + " not found");
        }

        private enum State
        {
            INIT,
            PARSE_CHANNEL,
            VALIDATE,
            RESOLVE_PUBLICATION,
            AWAIT_LOG_BUFFER,
            CREATE_PUBLICATION,
            DONE

View on GitHub (pinned to 6d60124e15)