{"record":{"id":"6d719073cd4c4183","repo":"apache/beam","slug":"solaceio-write-unboundedsolacewriter-context-timestamp-is","errorCode":null,"errorMessage":"SolaceIO.Write.UnboundedSolaceWriter.Context: Timestamp is required for a FinishBundleContext.","messagePattern":"SolaceIO\\.Write\\.UnboundedSolaceWriter\\.Context: Timestamp is required for a FinishBundleContext\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"sdks/java/io/solace/src/main/java/org/apache/beam/sdk/io/solace/write/UnboundedSolaceWriter.java","lineNumber":357,"sourceCode":"      return beamContextWrapper;\n    }\n\n    public static BeamContextWrapper of(FinishBundleContext finishBundleContext) {\n      BeamContextWrapper beamContextWrapper = new BeamContextWrapper();\n      beamContextWrapper.finishBundleContext = finishBundleContext;\n      return beamContextWrapper;\n    }\n\n    public <T> void output(\n        TupleTag<T> tag,\n        T output,\n        @Nullable Instant timestamp, // Not required for windowed context\n        @Nullable BoundedWindow window) { // Not required for windowed context\n      if (windowedContext != null) {\n        windowedContext.output(tag, output);\n      } else if (finishBundleContext != null) {\n        if (timestamp == null) {\n          throw new IllegalStateException(\n              \"SolaceIO.Write.UnboundedSolaceWriter.Context: Timestamp is required for a\"\n                  + \" FinishBundleContext.\");\n        }\n        if (window == null) {\n          throw new IllegalStateException(\n              \"SolaceIO.Write.UnboundedSolaceWriter.Context: BoundedWindow is required for a\"\n                  + \" FinishBundleContext.\");\n        }\n        finishBundleContext.output(tag, output, timestamp, window);\n      } else {\n        throw new IllegalStateException(\n            \"SolaceIO.Write.UnboundedSolaceWriter.Context: No context provided\");\n      }\n    }\n  }\n}\n","sourceCodeStart":339,"sourceCodeEnd":374,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/io/solace/src/main/java/org/apache/beam/sdk/io/solace/write/UnboundedSolaceWriter.java#L339-L374","documentation":"UnboundedSolaceWriter.Context.output throws this IllegalStateException when emitting via a FinishBundleContext without a timestamp. FinishBundleContext.output requires an explicit timestamp and window (unlike WindowedContext, which derives them); a null timestamp is a caller invariant violation in publishResults.","triggerScenarios":"Calling Context.output(tag, output) during finishBundle (finishBundleContext set, windowedContext null) while passing timestamp == null — an internal path bug in publishResults or a subclass overriding bundle lifecycle incorrectly.","commonSituations":"Custom subclasses of UnboundedSolaceWriter overriding finishBundle and emitting results without a timestamp; Beam runner upgrades changing when finishBundle is invoked; constructing the writer's Context manually with a null timestamp.","solutions":["Ensure publishResults/finishBundle passes a non-null timestamp (e.g. the bundle's minimum event timestamp or clock time) when emitting.","If you subclass the writer, always supply Instant.now() or a derived timestamp to context.output in finishBundle.","Check for null timestamp propagation from record metadata and default it before output.","Report/pin the Beam version — this may be an internal bug in the connector's publishResults path."],"exampleFix":"// before\ncontext.output(tag, results); // timestamp null in finishBundle\n// after\ncontext.output(tag, results, Instant.now(), window);","handlingStrategy":"validation","validationCode":"if (finishBundleContext != null && timestamp == null) {\n  throw new IllegalStateException(\"finishBundle output requires a non-null timestamp\");\n}","typeGuard":null,"tryCatchPattern":"try { context.output(tag, results); } catch (IllegalStateException e) { if (e.getMessage().contains(\"Timestamp is required\")) { /* supply timestamp */ } throw e; }","preventionTips":["Always pass a concrete Instant when emitting from finishBundle","Don't override finishBundle in subclasses without supplying timestamp/window","Test writer behavior on your Beam runner version"],"tags":["solace","java","beam","writer","timestamp"],"backgroundTag":"missing-required-argument","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}