Compilation compatibility is a big part of what Beam aims to provide with its guarantees. Romain makes a good point that most users are not invoking SeralizableFunctions themselves (they are usually invoked inside of Beam classes such as MapElements), however I suspect some users do these things.
On Sun, Oct 14, 2018 at 2:38 PM Kenneth Knowles <k...@apache.org> wrote: > Romain has brought up two good aspects of backwards compatibility: > > - runtime replacement vs recompile > - consumer (covariant) vs producer (contravariant, such as interfaces a > user implements) > > In this case, I think the best shoice is covariant and contravariant > (invariant) backwards compat including recompile compat. But we shouldn't > assume there is one obvious definition of "backwards compatibility". > > Does it help to introduce a new functional interface? > > Kenn > > On Sun, Oct 14, 2018 at 6:25 AM Romain Manni-Bucau <rmannibu...@gmail.com> > wrote: > >> Beam does not catch Exception for function usage so it will have to do it >> in some places. >> >> A user does not have to execute the function so worse case it impacts >> tests and in any case the most important: it does not impact the user until >> it recompiles the code (= runtime is not impacted). >> >> Romain Manni-Bucau >> @rmannibucau <https://twitter.com/rmannibucau> | Blog >> <https://rmannibucau.metawerx.net/> | Old Blog >> <http://rmannibucau.wordpress.com> | Github >> <https://github.com/rmannibucau> | LinkedIn >> <https://www.linkedin.com/in/rmannibucau> | Book >> <https://www.packtpub.com/application-development/java-ee-8-high-performance> >> >> >> Le dim. 14 oct. 2018 à 15:19, Reuven Lax <re...@google.com> a écrit : >> >>> What in Beam codebase is not ready, and how do we know that user code >>> doesn't have the same issue? >>> >>> On Sun, Oct 14, 2018 at 6:04 AM Romain Manni-Bucau < >>> rmannibu...@gmail.com> wrote: >>> >>>> Hmm, tested also and it works until something in the codeflow does not >>>> respect that constraint - see >>>> com.sun.tools.javac.comp.Flow.FlowAnalyzer#errorUncaught. In other words >>>> beam codebase is not ready for that and will make it fail but it is ok >>>> cause we can fix it but user code does not rely on that so it is fine to >>>> update it normally. >>>> >>>> Romain Manni-Bucau >>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>>> <https://rmannibucau.metawerx.net/> | Old Blog >>>> <http://rmannibucau.wordpress.com> | Github >>>> <https://github.com/rmannibucau> | LinkedIn >>>> <https://www.linkedin.com/in/rmannibucau> | Book >>>> <https://www.packtpub.com/application-development/java-ee-8-high-performance> >>>> >>>> >>>> Le dim. 14 oct. 2018 à 14:39, Reuven Lax <re...@google.com> a écrit : >>>> >>>>> Just tried it, doesn't appear to work :( >>>>> >>>>> error: unreported exception Exception; must be caught or declared to >>>>> be thrown >>>>> >>>>> On Sun, Oct 14, 2018 at 1:55 AM Romain Manni-Bucau < >>>>> rmannibu...@gmail.com> wrote: >>>>> >>>>>> not with java>=8 AFAIK >>>>>> >>>>>> Romain Manni-Bucau >>>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>>>>> <https://rmannibucau.metawerx.net/> | Old Blog >>>>>> <http://rmannibucau.wordpress.com> | Github >>>>>> <https://github.com/rmannibucau> | LinkedIn >>>>>> <https://www.linkedin.com/in/rmannibucau> | Book >>>>>> <https://www.packtpub.com/application-development/java-ee-8-high-performance> >>>>>> >>>>>> >>>>>> Le dim. 14 oct. 2018 à 10:49, Reuven Lax <re...@google.com> a écrit : >>>>>> >>>>>>> But it means that other functions that call SerializableFunctions >>>>>>> must now declare exceptions, right? If yes, this is incompatible. >>>>>>> >>>>>>> On Sun, Oct 14, 2018 at 1:37 AM Romain Manni-Bucau < >>>>>>> rmannibu...@gmail.com> wrote: >>>>>>> >>>>>>>> No, only parameter types and return type is used to lookup methods. >>>>>>>> >>>>>>>> Romain Manni-Bucau >>>>>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>>>>>>> <https://rmannibucau.metawerx.net/> | Old Blog >>>>>>>> <http://rmannibucau.wordpress.com> | Github >>>>>>>> <https://github.com/rmannibucau> | LinkedIn >>>>>>>> <https://www.linkedin.com/in/rmannibucau> | Book >>>>>>>> <https://www.packtpub.com/application-development/java-ee-8-high-performance> >>>>>>>> >>>>>>>> >>>>>>>> Le dim. 14 oct. 2018 à 09:45, Reuven Lax <re...@google.com> a >>>>>>>> écrit : >>>>>>>> >>>>>>>>> I've run into this problem before as well. Doesn't changing the >>>>>>>>> signature involve a backwards-incompatible change though? >>>>>>>>> >>>>>>>>> On Wed, Oct 3, 2018 at 5:11 PM Jeff Klukas <jklu...@mozilla.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> I'm working on https://issues.apache.org/jira/browse/BEAM-5638 >>>>>>>>>> to add exception handling options to single message transforms in >>>>>>>>>> the Java >>>>>>>>>> SDK. >>>>>>>>>> >>>>>>>>>> MapElements' via() method is overloaded to accept either a >>>>>>>>>> SimpleFunction, a SerializableFunction, or a Contextful, all of >>>>>>>>>> which are >>>>>>>>>> ultimately stored as a Contextful where the mapping functionis >>>>>>>>>> expected to >>>>>>>>>> have signature: >>>>>>>>>> >>>>>>>>>> OutputT apply(InputT element, Context c) throws Exception; >>>>>>>>>> >>>>>>>>>> So Contextful.Fn allows throwing checked exceptions, but neither >>>>>>>>>> SerializableFunction nor SimpleFunction do. The user-provided >>>>>>>>>> function has to satisfy the more restrictive signature: >>>>>>>>>> >>>>>>>>>> OutputT apply(InputT input); >>>>>>>>>> >>>>>>>>>> Is there background about why we allow arbitrary checked >>>>>>>>>> exceptions to be thrown in one case but not the other two? Could we >>>>>>>>>> consider expanding SerializableFunction and SimpleFunction to >>>>>>>>>> the following?: >>>>>>>>>> >>>>>>>>>> OutputT apply(InputT input) throws Exception; >>>>>>>>>> >>>>>>>>>> This would, for example, simplify the implementation of >>>>>>>>>> ParseJsons and AsJsons, where we have to catch an IOException in >>>>>>>>>> MapElements#via only to rethrow as RuntimeException. >>>>>>>>>> >>>>>>>>>