You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
request: return ListenableFutures in PubSub async methods rather than bare Futures #1148
It would be much more convenient if the Futures returned from PubSub were actually ListenableFuture instances (even if the interface did not define the return value to be ListenableFuture) - then it would not be necessary for users to block one thread per future they wish to adapt into a ListenableFuture.
For instance, internally PubSubImpl.pullAsync(final String subscription, int maxMessages) is implemented by using the listenable-like com.google.cloud.pubsub.spi.PubSubRpc.PullFuture and attaching callbacks to it, but the returned Future is an anonymous subclass of Future created by Futures.lazyTransform(..).
Is it a conscious decision to avoid using ListenableFutures in the interfaces defined in gcloud-java-pubsub and other clients?
It seems like the com.google.cloud.pubsub.spi layer has access to ListenableFuture instances via the generated grpc client code (like subscriberApi.acknowledgeCallable().futureCall(request)) but then these are discarded in the PubSubImpl layer.
Is it a conscious decision to avoid using ListenableFutures in the interfaces defined in gcloud-java-pubsub and other clients?
Yes, it's a conscious decision. We don't want to expose Guava-related classes in our interfaces and we still want to support Java 7 (for GAE and Android, mainly).
MessageConsumer is great - it perfectly fits my needs for consuming messages. It is awesome to not have to implement something that pulls messages in a loop and processes them in our own code.
The (minor) pain point comes more in code that deals with methods like Future<String> publishAsync(String topic, Message msg), when I would like to be able to transform the returned future to some other type or combine it with another future. We are heavy users of ListenableFuture and find it natural to transform and otherwise chain ListenableFutures together, so it is a small annoyance to have to use JdkFutureAdapters.listenInPoolThread and create a thread that blocks on Future.get() to be able to adapt this response to a ListenableFuture.
I understand not wanting to return Guava types in the PubSub interface, but wouldn't it be possible to return ListenableFuture implementations (SettableFuture, etc) in the PubSub implementation? This way adapters like JdkFutureAdapters would avoid having to spawn a blocked thread since the returned future would pass a if (future instanceof ListenableFuture) ... check.
I understand not wanting to return Guava types in the PubSub interface, but wouldn't it be possible to return ListenableFuture implementations (SettableFuture, etc) in the PubSub implementation?
Activity
mziccard commentedon Aug 10, 2016
Yes, it's a conscious decision. We don't want to expose Guava-related classes in our interfaces and we still want to support Java 7 (for GAE and Android, mainly).
Could
MessageConsumer pullAsync(String subscription, MessageProcessor callback, PullOption... options)help? If not, what is it missing that you need (I would be happy to add more features)?mattnworb commentedon Aug 10, 2016
Thanks @mziccard for the fast reply.
MessageConsumer is great - it perfectly fits my needs for consuming messages. It is awesome to not have to implement something that pulls messages in a loop and processes them in our own code.
The (minor) pain point comes more in code that deals with methods like
Future<String> publishAsync(String topic, Message msg), when I would like to be able to transform the returned future to some other type or combine it with another future. We are heavy users of ListenableFuture and find it natural to transform and otherwise chain ListenableFutures together, so it is a small annoyance to have to use JdkFutureAdapters.listenInPoolThread and create a thread that blocks onFuture.get()to be able to adapt this response to a ListenableFuture.I understand not wanting to return Guava types in the PubSub interface, but wouldn't it be possible to return ListenableFuture implementations (SettableFuture, etc) in the PubSub implementation? This way adapters like JdkFutureAdapters would avoid having to spawn a blocked thread since the returned future would pass a
if (future instanceof ListenableFuture) ...check.mziccard commentedon Aug 11, 2016
I will look into this, I'll keep you posted!
chore: remove All rights reserved clause from java.header (googleapis…
chore: remove All rights reserved clause from java.header (#1148) (#292)
deps: update dependency com.google.cloud:google-cloud-shared-dependen…
chore(deps): update dependency com.google.cloud:libraries-bom to v26.…
fix: Java doc for DefaultPKCEProvider.java (#1148)
chore(main): release 1.16.0 (#1139)
chore(main): release 1.80.0 (#11952)
fix: Java doc for DefaultPKCEProvider.java (#1148)
chore(main): release 1.16.0 (#1139)
chore(main): release 1.80.0 (#11952)
chore(main): release 2.9.9-SNAPSHOT (googleapis#1148)
chore(main): release 0.126.11 (#1148)
chore(main): release 0.126.11 (#1148)
deps: update dependency com.google.cloud:google-cloud-shared-dependen…
chore(main): release 1.119.0 (#1144)
deps: update dependency com.google.cloud:google-cloud-shared-dependen…
chore(main): release 1.119.0 (#1144)