{"record":{"id":"9ae61e6f6fc06b94","repo":"apache/seatunnel","slug":"start-mode-timestamp-must-not-be-greater-than-the-9ae61e","errorCode":null,"errorMessage":"start.mode.timestamp must not be greater than the current time","messagePattern":"start\\.mode\\.timestamp must not be greater than the current time","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-rocketmq/src/main/java/org/apache/seatunnel/connectors/seatunnel/rocketmq/source/RocketMqSourceConfig.java","lineNumber":136,"sourceCode":"                            catalogTable.getOptions(),\n                            catalogTable.getPartitionKeys(),\n                            catalogTable.getComment());\n        }\n        DeserializationSchema<SeaTunnelRow> deserializationSchema =\n                buildDeserialization(tableConfig, catalogTable);\n        List<String> tags = parseTags(tableConfig);\n        StartMode startMode =\n                tableConfig.getOptional(RocketMqSourceOptions.START_MODE).orElse(null);\n        Long startTimestamp = null;\n\n        if (startMode != null) {\n            switch (startMode) {\n                case CONSUME_FROM_TIMESTAMP:\n                    startTimestamp = tableConfig.get(RocketMqSourceOptions.START_MODE_TIMESTAMP);\n                    // Runtime check: cannot be declarative (depends on current time)\n                    long currentTimestamp = System.currentTimeMillis();\n                    if (startTimestamp > currentTimestamp) {\n                        throw new IllegalArgumentException(\n                                \"start.mode.timestamp must not be greater than the current time\");\n                    }\n                    break;\n                case CONSUME_FROM_SPECIFIC_OFFSETS:\n                    Map<String, Long> offsetConfigMap =\n                            tableConfig.get(RocketMqSourceOptions.START_MODE_OFFSETS);\n                    Map<MessageQueue, Long> specificOffsets = metadata.getSpecificStartOffsets();\n                    if (specificOffsets == null) {\n                        specificOffsets = new HashMap<>();\n                        metadata.setSpecificStartOffsets(specificOffsets);\n                    }\n                    for (Map.Entry<String, Long> entry : offsetConfigMap.entrySet()) {\n                        int splitIndex = entry.getKey().lastIndexOf(\"-\");\n                        String topicName = entry.getKey().substring(0, splitIndex);\n                        int queueId = Integer.parseInt(entry.getKey().substring(splitIndex + 1));\n                        specificOffsets.put(\n                                new MessageQueue(topicName, null, queueId), entry.getValue());\n                    }","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-rocketmq/src/main/java/org/apache/seatunnel/connectors/seatunnel/rocketmq/source/RocketMqSourceConfig.java#L118-L154","documentation":"RocketMqSourceConfig.parseTableConfig validates start.mode.timestamp during table config parsing. When start.mode = timestamp and the configured timestamp is in the future (greater than System.currentTimeMillis()), it throws IllegalArgumentException, since consuming from a future timestamp is not meaningful and the value can't be resolved declaratively.","triggerScenarios":"start.mode = CONSUME_FROM_TIMESTAMP with start.mode.timestamp > current wall-clock time; parseTableConfig runs at source config construction, failing the job at submission/planning time.","commonSituations":"Timestamp in milliseconds supplied as seconds (or vice versa) producing a huge value; timestamp computed from a future event or misconfigured template; clock skew between config generator and runtime.","solutions":["Set start.mode.timestamp to a past or current epoch-millisecond value","Confirm the value is in milliseconds, not seconds or a date string","Clamp/guard the value at generation time: Math.min(ts, System.currentTimeMillis())","Use start.mode = earliest/latest if a fixed past timestamp isn't required"],"exampleFix":"// before\nstart_mode = \"timestamp\"\nstart_mode_timestamp = 9999999999999\n// after\nstart_mode = \"timestamp\"\nstart_mode_timestamp = 1757472000000","handlingStrategy":"validation","validationCode":"long ts = Long.parseLong(cfg.get(\"start_mode_timestamp\"));\nif (ts > System.currentTimeMillis()) throw new IllegalArgumentException(\"start.mode.timestamp is in the future\");","typeGuard":null,"tryCatchPattern":"try { new RocketMqSourceConfig(tableConfig); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"start.mode.timestamp\")) { /* use past timestamp or start.mode=latest */ } throw e; }","preventionTips":["Always express timestamps in epoch milliseconds","Clamp generated timestamps to the current clock at config write time","Avoid hardcoding 'now' timestamps; prefer start.mode = latest"],"tags":["rocketmq","source","timestamp","start-mode"],"backgroundTag":"invalid-config-value","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}