apache/dolphinscheduler · error · IllegalArgumentException

jdbcRegistryData: is invalidated

Error message

jdbcRegistryData:  is invalidated

What it means

JdbcRegistryDataChangeEventDTO.fromJdbcRegistryDataChangeEvent parses the JSON payload of a change event into a JdbcRegistryData object; if JSONUtils.parseObject returns null (invalid or empty JSON), the DTO cannot be built and this IllegalArgumentException is thrown. It is a guard against corrupted or unparsable event data flowing through the JDBC registry's notification channel.

Solutions

  1. Inspect the offending event's raw JSON string (included in the message) and fix or delete the corrupted row/event
  2. Verify the JSON serialization format matches the current JdbcRegistryData class version
  3. Add validation at write time so only valid JdbcRegistryData JSON is persisted

Example fix

// before
JdbcRegistryData data = JSONUtils.parseObject(event.getJdbcRegistryData(), JdbcRegistryData.class);
// after
if (StringUtils.isBlank(event.getJdbcRegistryData())) {
    log.warn("Skipping invalid change event: {}", event.getId());
    return;
}
JdbcRegistryData data = JSONUtils.parseObject(event.getJdbcRegistryData(), JdbcRegistryData.class);
Defensive patterns

Strategy: try-catch

Validate before calling

String raw = event.getJdbcRegistryData(); if (raw == null || raw.isEmpty() || !raw.trim().startsWith("{")) { skip(event); }

Try / catch

try { dto = JdbcRegistryDataChangeEventDTO.fromJdbcRegistryDataChangeEvent(event); } catch (IllegalArgumentException e) { log.error("Corrupt event {}: {}", event.getId(), e.getMessage()); }

Prevention

When it happens

Trigger: A JdbcRegistryDataChangeEvent whose getJdbcRegistryData() returns null, empty, or non-JSON text; JSON that parses to null under the fastjson configuration used by JSONUtils; corrupted rows in the jdbc registry data table broadcast as change events.

Common situations: Database rows edited manually or truncated by column-size limits, version mismatch where the serialized JdbcRegistryData JSON schema changed, and consumers replaying old or malformed event records.

Understand the failure class

Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.

Related errors


AI-assisted analysis of apache/dolphinscheduler@02eac45a1b (2026-09-06). Data as JSON: /api/errors/a29799f4f889b8af. Report an issue: GitHub.

Appendix: source

Thrown at dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/model/DTO/JdbcRegistryDataChangeEventDTO.java:56

    private EventType eventType;

    private JdbcRegistryDataDTO jdbcRegistryData;

    private Date createTime;

    public enum EventType {
        ADD,
        UPDATE,
        DELETE;

    }

    public static JdbcRegistryDataChangeEventDTO fromJdbcRegistryDataChangeEvent(JdbcRegistryDataChangeEvent jdbcRegistryDataChangeEvent) {
        JdbcRegistryData jdbcRegistryData =
                JSONUtils.parseObject(jdbcRegistryDataChangeEvent.getJdbcRegistryData(), JdbcRegistryData.class);
        if (jdbcRegistryData == null) {
            throw new IllegalArgumentException(
                    "jdbcRegistryData: " + jdbcRegistryDataChangeEvent.getJdbcRegistryData() + " is invalidated");
        }
        return JdbcRegistryDataChangeEventDTO.builder()
                .id(jdbcRegistryDataChangeEvent.getId())
                .jdbcRegistryData(JdbcRegistryDataDTO.fromJdbcRegistryData(jdbcRegistryData))
                .eventType(EventType.valueOf(jdbcRegistryDataChangeEvent.getEventType()))
                .createTime(jdbcRegistryDataChangeEvent.getCreateTime())
                .build();
    }

    public static JdbcRegistryDataChangeEvent toJdbcRegistryDataChangeEvent(JdbcRegistryDataChangeEventDTO jdbcRegistryDataChangeEvent) {
        return JdbcRegistryDataChangeEvent.builder()
                .id(jdbcRegistryDataChangeEvent.getId())
                .jdbcRegistryData(JSONUtils.toJsonString(jdbcRegistryDataChangeEvent.getJdbcRegistryData()))
                .eventType(jdbcRegistryDataChangeEvent.getEventType().name())
                .createTime(jdbcRegistryDataChangeEvent.getCreateTime())
                .build();
    }

View on GitHub (pinned to 02eac45a1b)