{"record":{"id":"57d0b5de8e6db969","repo":"apache/flink","slug":"unsupported-type-of-window-strategy-strategycla","errorCode":null,"errorMessage":"Unsupported type of window strategy : {strategyClass}","messagePattern":"Unsupported type of window strategy : (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"critical","filePath":"flink-datastream/src/main/java/org/apache/flink/datastream/impl/extension/window/utils/WindowUtils.java","lineNumber":68,"sourceCode":"        } else if (windowStrategy instanceof SlidingTimeWindowStrategy) {\n            return ((SlidingTimeWindowStrategy) windowStrategy).getAllowedLateness().toMillis();\n        } else {\n            return 0;\n        }\n    }\n\n    /** Create a {@link WindowAssigner} according to {@link WindowStrategy}. */\n    public static WindowAssigner<?, ?> createWindowAssigner(WindowStrategy windowStrategy) {\n        if (windowStrategy instanceof GlobalWindowStrategy) {\n            return createGlobalWindowAssigner();\n        } else if (windowStrategy instanceof TumblingTimeWindowStrategy) {\n            return createTumblingTimeWindowAssigner((TumblingTimeWindowStrategy) windowStrategy);\n        } else if (windowStrategy instanceof SlidingTimeWindowStrategy) {\n            return createSlidingTimeWindowAssigner((SlidingTimeWindowStrategy) windowStrategy);\n        } else if (windowStrategy instanceof SessionWindowStrategy) {\n            return createSessionWindowAssigner((SessionWindowStrategy) windowStrategy);\n        } else {\n            throw new IllegalArgumentException(\n                    \"Unsupported type of window strategy : \" + windowStrategy.getClass());\n        }\n    }\n\n    /** Create window assigner for global window. */\n    private static WindowAssigner<?, ?> createGlobalWindowAssigner() {\n        return GlobalWindows.createWithEndOfStreamTrigger();\n    }\n\n    /** Create window assigner for tumbling time window. */\n    private static WindowAssigner<?, ?> createTumblingTimeWindowAssigner(\n            TumblingTimeWindowStrategy windowStrategy) {\n        switch (windowStrategy.getTimeType()) {\n            case PROCESSING:\n                return TumblingProcessingTimeWindows.of(windowStrategy.getWindowSize());\n            case EVENT:\n                return TumblingEventTimeWindows.of(windowStrategy.getWindowSize());\n            default:","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-datastream/src/main/java/org/apache/flink/datastream/impl/extension/window/utils/WindowUtils.java#L50-L86","documentation":"WindowUtils.createWindowAssigner translates the user-facing WindowStrategy into a runtime WindowAssigner via an instanceof chain that recognizes exactly four classes: GlobalWindowStrategy, TumblingTimeWindowStrategy, SlidingTimeWindowStrategy and SessionWindowStrategy. Any other WindowStrategy instance falls through to IllegalArgumentException during job translation, before the job ever runs. Because the check is instanceof-based (not sealed), it also fails for same-named classes loaded from a different jar version.","triggerScenarios":"Passing anything but the four built-in strategies to a windowed DataStream v2 operator: a user subclass of WindowStrategy, an instance deserialized/built from a mismatched flink-datastream jar, or a plain 'new WindowStrategy()' base instance. The throw happens when the job graph is translated, i.e. at submit time in the client or JobManager.","commonSituations":"Developers extending WindowStrategy hoping to add custom windowing; mixed flink-datastream-api (client) and flink-dist (cluster) versions where the strategy class is duplicated; shading/relocation producing two copies of the strategy classes.","solutions":["Build strategies only via the WindowStrategy factories: global(), tumbling(...), sliding(...), session(...).","Align flink-datastream-api and flink-dist versions in the project and on the cluster; inspect the fat jar and flink/lib for duplicate strategy classes.","If custom windowing is required, use a WindowAssigner-based DataStream v1 window operator instead of subclassing WindowStrategy.","Log windowStrategy.getClass().getName() and its ClassLoader in job setup to confirm the instance comes from the expected jar."],"exampleFix":"// before: custom subclass the runtime cannot map\nclass MyWindowStrategy extends WindowStrategy {}\nstream.process(fn, new MyWindowStrategy());\n// after: built-in factory\nclass MyWindowStrategy extends WindowStrategy {}\nstream.process(fn, WindowStrategy.tumbling(Duration.ofMinutes(1), WindowStrategy.EVENT_TIME));","handlingStrategy":"type-guard","validationCode":"// reject unknown strategies at job composition time with a clear message\nif (!isSupportedStrategy(strategy)) {\n    throw new IllegalArgumentException(\n            \"Unsupported WindowStrategy: \" + strategy.getClass().getName()\n                    + \"; use WindowStrategy.global/tumbling/sliding/session\");\n}\nstream.process(fn, strategy);","typeGuard":"static boolean isSupportedStrategy(WindowStrategy s) {\n    return s instanceof GlobalWindowStrategy\n            || s instanceof TumblingTimeWindowStrategy\n            || s instanceof SlidingTimeWindowStrategy\n            || s instanceof SessionWindowStrategy;\n}","tryCatchPattern":null,"preventionTips":["Build strategies only via the WindowStrategy factory methods","Keep flink-datastream-api and flink-dist on the same release; check fat jars for duplicates","For custom windowing use the DataStream v1 WindowAssigner API instead of subclassing WindowStrategy"],"tags":["flink","datastream-v2","windowing","window-strategy","job-translation","version-mismatch"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}