apache/seatunnel · error · IllegalArgumentException

Option 'field_delimiter' cannot be empty

Error message

Option 'field_delimiter' cannot be empty

What it means

Config validation in AzureQueueSinkConfig.validate: when the message format is TEXT, field_delimiter is required to join record fields into the queue message; an empty delimiter would silently concatenate all fields, so it is rejected with IllegalArgumentException at sink initialization.

Source

Thrown at seatunnel-connectors-v2/connector-azure-queue-storage/src/main/java/org/apache/seatunnel/connectors/seatunnel/azure/queue/config/AzureQueueSinkConfig.java:71

                        .accountName(config.get(AzureQueueStorageSinkOptions.ACCOUNT_NAME))
                        .accountKey(config.get(AzureQueueStorageSinkOptions.ACCOUNT_KEY))
                        .sasToken(config.get(AzureQueueStorageSinkOptions.SAS_TOKEN))
                        .format(config.get(AzureQueueStorageSinkOptions.FORMAT))
                        .fieldDelimiter(config.get(AzureQueueStorageSinkOptions.FIELD_DELIMITER))
                        .messageEncoding(config.get(AzureQueueStorageSinkOptions.MESSAGE_ENCODING))
                        .maxInFlight(config.get(AzureQueueStorageSinkOptions.MAX_IN_FLIGHT))
                        .operationTimeoutMillis(
                                config.get(AzureQueueStorageSinkOptions.OPERATION_TIMEOUT_MS))
                        .build();
        sinkConfig.validate();
        return sinkConfig;
    }

    private void validate() {
        AzureQueueConfigValidator.validateClient(this);

        if (format == MessageFormat.TEXT && fieldDelimiter.isEmpty()) {
            throw new IllegalArgumentException("Option 'field_delimiter' cannot be empty");
        }
        if (maxInFlight <= 0) {
            throw new IllegalArgumentException("Option 'max_in_flight' must be greater than zero");
        }
        if (operationTimeoutMillis <= 0) {
            throw new IllegalArgumentException(
                    "Option 'operation_timeout_ms' must be greater than zero");
        }
    }
}

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Set field_delimiter to a non-empty separator, e.g. "," or "\t"
  2. Use format = JSON instead of TEXT if delimiter joining is not desired
  3. Remove the field_delimiter key so the default delimiter is used

Example fix

// before
format = TEXT
field_delimiter = ""
// after
format = TEXT
field_delimiter = ","
Defensive patterns

Strategy: validation

Validate before calling

java
if (format == MessageFormat.TEXT && (fieldDelimiter == null || fieldDelimiter.isEmpty())) {
    fieldDelimiter = ",";
}

Try / catch

java
try {
    AzureQueueSinkConfig.from(config);
} catch (IllegalArgumentException e) {
    if (e.getMessage().equals("Option 'field_delimiter' cannot be empty")) {
        log.error("Set a non-empty field_delimiter or use format=JSON");
    } else { throw e; }
}

Prevention

When it happens

Trigger: Building AzureQueueSinkConfig via from() with MessageFormat.TEXT and field_delimiter = "" (e.g. field_delimiter = "" in the config).

Common situations: User wanted to disable delimiter joining and set an empty value; template default left empty; HOCON parsed a quoted empty string instead of falling back to the default ",".

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/4eb48dd701dda04e. Report an issue: GitHub.