Uploaded image for project: 'Kafka'
  1. Kafka
  2. KAFKA-7267

KafkaStreams Scala DSL process method should accept a ProcessorSupplier

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Minor
    • Resolution: Unresolved
    • 2.0.0
    • None
    • streams

    Description

      scala.KafkaStreams#process currently expects a ()=>Processor, which is semantically equivalent to a ProcessorSupplier, but it's the only such method to do so.

      All the similar methods in the Scala DSL take a Supplier like their Java counterparts.

      Note that on Scala 2.12+, SAM conversion allows callers to pass either a function or a supplier when the parameter is a ProcessorSupplier. (But if the parameter is a function, you must pass a function)

      But on scala 2.11-, callers will have to pass a function if the parameter is a function and a supplier if the parameter is a supplier. This means that currently, 2.11 users are confronted with an api that demands they construct suppliers for all the methods except process, which demands a function.

      Mitigating factor: we have some implicits available to convert a Function0 to a supplier, and we could add an implicit from ProcessorSupplier to Function0 to smooth over the API.

       

      What to do about it?

      We could just change the existing method to take a ProcessorSupplier instead.

      • 2.12+ users would not notice a difference during compilation, as SAM conversion would kick in. However, if they just swap in the new jar without recompiling, I think they'd get a MethodDefNotFound error.
      • 2.11- users would not be able to compile their existing code. They'd have to swap their function out for a ProcessorSupplier or pull the implicit conversion into scope.
      • Note that we can delay this action until we drop 2.11 support, and we would break no one.

      We could deprecate the existing method and add a new one taking a ProcessorSupplier.

      • All scala users would be able to compile their existing code and also swap in the new version at runtime.
      • Anyone explicitly passing a function would get a deprecation warning, though, regardless of SAM conversion or implicit conversion, since neither conversion won't kick in if there's actually a method overload expecting a function. This would drive everyone to explicitly create a supplier (unnecessarily)

      We could leave the existing method without deprecating it and add a new one taking a ProcessorSupplier.

      • All scala users would be able to compile their existing code and also swap in the new version at runtime.
      • There would be no unfortunate deprecation warnings.
      • The interface would list two process methods, which is untidy.
      • Once we drop 2.11 support, we would just drop the function variant.

      Attachments

        Activity

          People

            Unassigned Unassigned
            vvcephei John Roesler
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated: