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

  1. Verify the queue name exists on the message VPN via the broker CLI/UI or a direct SEMP call.
  2. Check SEMP connection settings: correct management host/port, SEMP API v2 endpoint, and message VPN name.
  3. Ensure the basic-auth user has SEMP/administrative read permissions for queue access-type queries.
  4. 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

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


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)