private static <InputT, OutputT> void verifyFnIsStateful(DoFn<InputT, OutputT> fn) { DoFnSignature signature = DoFnSignatures.getSignature(fn.getClass()); // It is still correct to use this without state or timers, but a bad idea. // Since it is internal it should never be used wrong, so it is OK to crash. checkState( signature.usesState() || signature.usesTimers(), "%s used for %s that does not use state or timers.", BatchStatefulParDoOverrides.class.getSimpleName(), ParDo.class.getSimpleName()); } }
@Override public boolean matches(AppliedPTransform<?, ?, ?> application) { PTransform<?, ?> transform = application.getTransform(); if (transform instanceof ParDo.SingleOutput) { DoFn<?, ?> fn = ((ParDo.SingleOutput<?, ?>) transform).getFn(); DoFnSignature signature = DoFnSignatures.signatureForDoFn(fn); return signature.usesState() || signature.usesTimers(); } return false; }
@Override public boolean matches(AppliedPTransform<?, ?, ?> application) { PTransform<?, ?> transform = application.getTransform(); if (transform instanceof ParDo.MultiOutput) { DoFn<?, ?> fn = ((ParDo.MultiOutput<?, ?>) transform).getFn(); DoFnSignature signature = DoFnSignatures.signatureForDoFn(fn); return signature.usesState() || signature.usesTimers(); } return false; }
DoFnSignature signature = DoFnSignatures.getSignature(fn.getClass()); if (signature.usesState() || signature.usesTimers()) { DataflowRunner.verifyStateSupported(fn); DataflowRunner.verifyStateSupportForWindowingStrategy(windowingStrategy); && (signature.usesState() || signature.usesTimers())) { stepContext.addInput(PropertyNames.USES_KEYED_STATE, "true");
if (signature.usesState() || signature.usesTimers()) { validateStateApplicableForInput(fn, input);