Jun,

we still get the benefit of extending Closeable. e.g. Utils.closeQuietly()
can take FooSerializer as an argument. we can avoid the duplication of
boiler-plate code.

class FooSerializer implements Serializer {

    @Override
    public void close() {
        // may throw unchecked RuntimeException
    }
}

final class Utils {
    public static void closeQuietly(Closeable c, String name,
AtomicReference<Throwable> firstException) {
    if (c != null) {
        try {
            c.close();
        } catch (Throwable t) {
            firstException.compareAndSet(null, t);
            log.error("Failed to close " + name, t);
        }
    }
}

On Wed, Apr 29, 2015 at 6:51 AM, Jun Rao <j...@confluent.io> wrote:

> If you do this, the code is no longer simple, which defeats the benefit of
> extending Closeable. We can define our own Closeable that doesn't throw
> exceptions, but it may be confusing. So, it seems the original code is
> probably better.
>
> Thanks,
>
> Jun
>
> On Tue, Apr 28, 2015 at 3:11 PM, Steven Wu <stevenz...@gmail.com> wrote:
>
> > sorry for the previous empty msg.
> >
> > Jay's idea should work. basically, we override the close method in
> > Serializer interface.
> >
> > public interface Serializer<T> extends Closeable {
> >     @Override
> >     public void close();
> > }
> >
> > On Tue, Apr 28, 2015 at 1:10 PM, Steven Wu <stevenz...@gmail.com> wrote:
> >
> > >
> > >
> > > On Tue, Apr 28, 2015 at 1:03 PM, Ewen Cheslack-Postava <
> > e...@confluent.io>
> > > wrote:
> > >
> > >> Good point Jay. More specifically we were already implementing without
> > the
> > >> checked exception, we'd need to override close() in the Serializer and
> > >> Deserializer interfaces and omit the throws clause. That definitely
> > makes
> > >> them source compatible. Not sure about binary compatibility, I
> couldn't
> > >> find a quick answer but I think it's probably still compatible.
> > >>
> > >> -Ewen
> > >>
> > >> On Tue, Apr 28, 2015 at 12:30 PM, Jay Kreps <jay.kr...@gmail.com>
> > wrote:
> > >>
> > >> > Hey guys,
> > >> >
> > >> > You can implement Closable without the checked exception. Having
> > close()
> > >> > methods throw checked exceptions isn't very useful unless there is a
> > way
> > >> > for the caller to recover. In this case there really isn't, right?
> > >> >
> > >> > -Jay
> > >> >
> > >> > On Mon, Apr 27, 2015 at 5:51 PM, Guozhang Wang <wangg...@gmail.com>
> > >> wrote:
> > >> >
> > >> > > Folks,
> > >> > >
> > >> > > In a recent commit I made regarding KAFKA-2121, there is an
> omitted
> > >> API
> > >> > > change which makes Serializer / Deserializer extending from
> > Closeable,
> > >> > > whose close() call could throw IOException by declaration. Hence
> now
> > >> some
> > >> > > scenario like:
> > >> > >
> > >> > > ---------------------
> > >> > >
> > >> > > Serializer<T> keySerializer = ...
> > >> > > Serializer<T> valueSerializer = ...
> > >> > > KafkaProducer producer = new KafkaProducer(config, keySerializer,
> > >> > > valueSerializer)
> > >> > > // ...
> > >> > > keySerializer.close()
> > >> > > valueSerializer.close()
> > >> > >
> > >> > > ---------------------
> > >> > >
> > >> > > will need to capture IOException now.
> > >> > >
> > >> > > Want to bring this up for people's attention, and you opinion on
> > >> whether
> > >> > we
> > >> > > should revert this change?
> > >> > >
> > >> > > -- Guozhang
> > >> > >
> > >> >
> > >>
> > >>
> > >>
> > >> --
> > >> Thanks,
> > >> Ewen
> > >>
> > >
> > >
> >
>

Reply via email to