{"record":{"id":"dd3ec2b1c1a070dc","repo":"apache/seatunnel","slug":"configuration-failed-dd3ec2","errorCode":"CONFIGURATION_FAILED","errorMessage":"Google Pub/Sub source supports streaming jobs only","messagePattern":"Google Pub/Sub source supports streaming jobs only","errorType":"error_code","errorClass":"GooglePubSubConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-google-pubsub/src/main/java/org/apache/seatunnel/connectors/seatunnel/google/pubsub/source/GooglePubSubSource.java","lineNumber":64,"sourceCode":"    private final CatalogTable catalogTable;\n    private final DeserializationSchema<SeaTunnelRow> deserializationSchema;\n\n    private JobContext jobContext;\n\n    public GooglePubSubSource(\n            GooglePubSubSourceConfig config,\n            CatalogTable catalogTable,\n            DeserializationSchema<SeaTunnelRow> deserializationSchema) {\n        this.config = config;\n        this.catalogTable = catalogTable;\n        this.deserializationSchema = deserializationSchema;\n    }\n\n    @Override\n    public Boundedness getBoundedness() {\n        if (jobContext != null) {\n            if (!JobMode.STREAMING.equals(jobContext.getJobMode())) {\n                throw new GooglePubSubConnectorException(\n                        GooglePubSubConnectorErrorCode.CONFIGURATION_FAILED,\n                        \"Google Pub/Sub source supports streaming jobs only\");\n            }\n            if (!jobContext.isEnableCheckpoint()) {\n                throw new GooglePubSubConnectorException(\n                        GooglePubSubConnectorErrorCode.CONFIGURATION_FAILED,\n                        \"Google Pub/Sub source requires checkpointing to acknowledge messages\");\n            }\n        }\n        return Boundedness.UNBOUNDED;\n    }\n\n    @Override\n    public String getPluginName() {\n        return PLUGIN_NAME;\n    }\n\n    @Override","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-google-pubsub/src/main/java/org/apache/seatunnel/connectors/seatunnel/google/pubsub/source/GooglePubSubSource.java#L46-L82","documentation":"Thrown by GooglePubSubSource.getBoundedness(), which is consulted during job planning (including shouldRequireStreamingModeWithCheckpointing). Google Pub/Sub is an unbounded streaming source, so running it in a batch job is rejected up front with code CONFIGURATION_FAILED.","triggerScenarios":"Submitting a SeaTunnel job with job.mode = BATCH that contains a GooglePubSub source; getBoundedness() detects JobMode != STREAMING and throws.","commonSituations":"Users copy a batch config template and swap in the Pub/Sub source without changing job.mode, or a scheduling wrapper runs streaming jobs in batch mode by default.","solutions":["Set job.mode = STREAMING in the job configuration.","Use a genuinely batch source (e.g. file/JDBC) if a batch job is actually required.","If the job is submitted programmatically, ensure the JobConfig mode passed to the client is STREAMING."],"exampleFix":"// before\nenv {\n  job.mode = \"BATCH\"\n}\n// after\nenv {\n  job.mode = \"STREAMING\"\n}","handlingStrategy":"validation","validationCode":"if (!\"streaming\".equalsIgnoreCase(jobConfig.getEnv().getJobMode())) {\n    throw new IllegalArgumentException(\"GooglePubSub source requires job.mode = STREAMING\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use dedicated streaming job templates when using Pub/Sub sources.","Review job.mode before switching a source in an existing config."],"tags":["google-pubsub","job-mode","config-validation","java"],"backgroundTag":"unsupported-operation","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}