If you use KafkaProducer as a Closable, you still need to catch the
exception when calling close(), right? So the behavior is different whether
you use it as a Producer or a Closable?

Thanks,

Jun

On Thu, Apr 30, 2015 at 6:26 PM, Jay Kreps <j...@confluent.io> wrote:

> Hey Jun,
>
> I think the Closable interface is what we've used elsewhere and what the
> rest of the java world uses. I don't think it is too hard for us to add the
> override in our interface--implementors of the interface don't need to do
> it.
>
> -Jay
>
> On Thu, Apr 30, 2015 at 4:02 PM, Jun Rao <j...@confluent.io> wrote:
>
> > That makes sense. Then, would it be better to have a KafkaClosable
> > interface that doesn't throw exception? This way, we don't need to
> override
> > close in every implementing class.
> >
> > Thanks,
> >
> > Jun
> >
> > On Wed, Apr 29, 2015 at 10:36 AM, Steven Wu <stevenz...@gmail.com>
> wrote:
> >
> > > 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