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
- Use the correlationId from the Image whose hasSendResponseSetup() is true (delivered via the image available handler) as response-correlation-id.
- Ensure the originating subscription channel was created with control-mode=response so images carry send-response-setup.
- Do not cache response correlation ids across sessions; capture them per connection event.
- 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
- Only use image.correlationId() from images with hasSendResponseSetup()
- Capture response correlation ids in the image-available handler, never cache across sessions
- Ensure the peer subscription was created with control-mode=response
- Do not confuse publication/subscription registration ids with the image correlationId
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
- control-mode=response was specified, but no…
- responseCorrelationId must be positive
- Aeron spies are invalid as send destinations: channel=
- AeronArchive.Context.messageRetryAttempts must be > 0, got:
- applicationSpecificFeedback length must be equal to
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,
DONEView on GitHub (pinned to 6d60124e15)