apache/beam · error · IOException
SolaceIO: response from SEMP is empty!
Error message
SolaceIO: response from SEMP is empty!
What it means
SolaceIO throws this IOException in SempBasicAuthClientExecutor.isQueueNonExclusive when the SEMP (Solace Element Management Protocol) HTTP response for the queue returns null content. The connector queries the broker's management API to learn the queue's access type; an empty response means the queue metadata could not be retrieved, so the queue-ownership check cannot proceed.
Solutions
- Verify the queue name exists on the message VPN via the broker CLI/UI or a direct SEMP call.
- Check SEMP connection settings: correct management host/port, SEMP API v2 endpoint, and message VPN name.
- Ensure the basic-auth user has SEMP/administrative read permissions for queue access-type queries.
- Capture the raw HTTP response (curl the SEMP endpoint) to see why the body is empty.
Example fix
// before
boolean nonExclusive = sempClient.isQueueNonExclusive("myQueue");
// after (pre-validate via SEMP)
BrokerResponse resp = sempClient.getQueueResponse("myQueue");
if (resp == null || resp.content == null) {
throw new IOException("SEMP returned no body for queue myQueue — check SEMP URL/permissions");
}
boolean nonExclusive = sempClient.isQueueNonExclusive("myQueue"); Defensive patterns
Strategy: try-catch
Validate before calling
BrokerResponse r = sempClient.getQueueResponse(queueName);
if (r == null || r.content == null) { /* fix SEMP config before proceeding */ } Try / catch
try { return sempClient.isQueueNonExclusive(queueName); } catch (IOException e) { if (e.getMessage().contains("SEMP is empty")) { /* check SEMP URL/permissions */ } throw e; } Prevention
- Verify queue exists in the VPN before querying SEMP
- Grant the SEMP user management read permissions
- Test the SEMP endpoint with curl during setup
When it happens
Trigger: Calling `isQueueNonExclusive(queueName)` when `getQueueResponse(queueName)` returns a BrokerResponse whose `content` is null — e.g. the SEMP endpoint returned no body (wrong SEMP URL/version, HTTP error swallowed, auth rejected so no JSON payload).
Common situations: Incorrect SEMP base URL or management port; SEMP API v2 not enabled on the broker; basic-auth credentials lacking management permissions; queue name doesn't exist so the response body is empty; network proxy stripping the response body.
Understand the failure class
Background: "empty response", "returned no data", "empty embeddings": what HTTP 200-with-empty-body errors mean across libraries — this error's family across 36 libraries.
Related errors
- 2xx codes should not be exceptions. Got status code
- Failed to read broker response content
- SolaceIO: Caught StaleSessionException, restarting the…
- SolaceIO.Read: Could not create a receiver from the Jcsmp…
- SolaceIO.Write: Overriding JCSMP properties for testing…
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/38bd4a12c0419478.
Report an issue: GitHub.
Appendix: source
Thrown at sdks/java/io/solace/src/main/java/org/apache/beam/sdk/io/solace/broker/SempBasicAuthClientExecutor.java:93
public SempBasicAuthClientExecutor(
String host,
String username,
String password,
String vpnName,
HttpRequestFactory httpRequestFactory) {
this.baseUrl = String.format("%s/SEMP/v2", host);
this.username = username;
this.messageVpn = vpnName;
this.password = password;
this.requestFactory = httpRequestFactory;
this.cookieManagerKey = new CookieManagerKey(this.baseUrl, this.username);
COOKIE_MANAGER_MAP.computeIfAbsent(this.cookieManagerKey, key -> new CookieManager());
}
public boolean isQueueNonExclusive(String queueName) throws IOException {
BrokerResponse response = getQueueResponse(queueName);
if (response.content == null) {
throw new IOException("SolaceIO: response from SEMP is empty!");
}
Queue q = mapJsonToClass(response.content, Queue.class);
return q.data().accessType().equals("non-exclusive");
}
private static String getQueueEndpoint(String messageVpn, String queueName)
throws UnsupportedEncodingException {
return String.format(
"/monitor/msgVpns/%s/queues/%s", urlEncode(messageVpn), urlEncode(queueName));
}
private static String createQueueEndpoint(String messageVpn) throws UnsupportedEncodingException {
return String.format("/config/msgVpns/%s/queues", urlEncode(messageVpn));
}
private static String subscriptionEndpoint(String messageVpn, String queueName)
throws UnsupportedEncodingException {
return String.format(View on GitHub (pinned to 12126d8942)