@Override public CompletableFuture<Void> seekAsync(MessageId messageId) { return FutureUtil.failedFuture(new PulsarClientException("Seek operation not supported on topics consumer")); }
@Override public CompletableFuture<Void> unsubscribeAsync() { if (getState() == State.Closing || getState() == State.Closed) { return FutureUtil.failedFuture( new PulsarClientException.AlreadyClosedException("Topics Consumer was already closed")); } setState(State.Closing); CompletableFuture<Void> unsubscribeFuture = new CompletableFuture<>(); List<CompletableFuture<Void>> futureList = consumers.values().stream() .map(c -> c.unsubscribeAsync()).collect(Collectors.toList()); FutureUtil.waitForAll(futureList) .whenComplete((r, ex) -> { if (ex == null) { setState(State.Closed); unAckedMessageTracker.close(); unsubscribeFuture.complete(null); log.info("[{}] [{}] [{}] Unsubscribed Topics Consumer", topic, subscription, consumerName); } else { setState(State.Failed); unsubscribeFuture.completeExceptionally(ex); log.error("[{}] [{}] [{}] Could not unsubscribe Topics Consumer", topic, subscription, consumerName, ex.getCause()); } }); return unsubscribeFuture; }
@Override public CompletableFuture<Void> closeAsync() { if (getState() == State.Closing || getState() == State.Closed) { unAckedMessageTracker.close(); return CompletableFuture.completedFuture(null); } setState(State.Closing); CompletableFuture<Void> closeFuture = new CompletableFuture<>(); List<CompletableFuture<Void>> futureList = consumers.values().stream() .map(c -> c.closeAsync()).collect(Collectors.toList()); FutureUtil.waitForAll(futureList) .whenComplete((r, ex) -> { if (ex == null) { setState(State.Closed); unAckedMessageTracker.close(); closeFuture.complete(null); log.info("[{}] [{}] Closed Topics Consumer", topic, subscription); client.cleanupConsumer(this); // fail all pending-receive futures to notify application failPendingReceive(); } else { setState(State.Failed); closeFuture.completeExceptionally(ex); log.error("[{}] [{}] Could not close Topics Consumer", topic, subscription, ex.getCause()); } }); return closeFuture; }
@Override public void run(Timeout timeout) throws Exception { if (timeout.isCancelled()) { return; } CompletableFuture<Void> recheckFuture = new CompletableFuture<>(); List<CompletableFuture<Void>> futures = Lists.newArrayListWithExpectedSize(2); client.getLookup().getTopicsUnderNamespace(namespaceName, subscriptionMode).thenAccept(topics -> { if (log.isDebugEnabled()) { log.debug("Get topics under namespace {}, topics.size: {}", namespaceName.toString(), topics.size()); topics.forEach(topicName -> log.debug("Get topics under namespace {}, topic: {}", namespaceName.toString(), topicName)); } List<String> newTopics = PulsarClientImpl.topicsPatternFilter(topics, topicsPattern); List<String> oldTopics = PatternMultiTopicsConsumerImpl.this.getTopics(); futures.add(topicsChangeListener.onTopicsAdded(topicsListsMinus(newTopics, oldTopics))); futures.add(topicsChangeListener.onTopicsRemoved(topicsListsMinus(oldTopics, newTopics))); FutureUtil.waitForAll(futures) .thenAccept(finalFuture -> recheckFuture.complete(null)) .exceptionally(ex -> { log.warn("[{}] Failed to recheck topics change: {}", topic, ex.getMessage()); recheckFuture.completeExceptionally(ex); return null; }); }); // schedule the next re-check task client.timer().newTimeout(PatternMultiTopicsConsumerImpl.this, Math.min(1, conf.getPatternAutoDiscoveryPeriod()), TimeUnit.MINUTES); }
@Override public CompletableFuture<Reader<T>> createAsync() { if (conf.getTopicName() == null) { return FutureUtil .failedFuture(new IllegalArgumentException("Topic name must be set on the reader builder")); } if (conf.getStartMessageId() == null) { return FutureUtil .failedFuture(new IllegalArgumentException("Start message id must be set on the reader builder")); } return client.createReaderAsync(conf, schema); }
log.info("Client closing. URL: {}", lookup.getServiceUrl()); if (!state.compareAndSet(State.Open, State.Closing)) { return FutureUtil.failedFuture(new PulsarClientException.AlreadyClosedException("Client already closed")); FutureUtil.waitForAll(futures).thenRun(() -> {
FutureUtil.waitForAll(futureList) .thenAccept(finalFuture -> { try {
@Override public CompletableFuture<Message<T>> receiveAsync() { if (listener != null) { return FutureUtil.failedFuture(new PulsarClientException.InvalidConfigurationException( "Cannot use receive() when a listener has been set")); } switch (getState()) { case Ready: case Connecting: break; // Ok case Closing: case Closed: return FutureUtil.failedFuture(new PulsarClientException.AlreadyClosedException("Consumer already closed")); case Terminated: return FutureUtil.failedFuture(new PulsarClientException.AlreadyClosedException("Topic was terminated")); case Failed: case Uninitialized: return FutureUtil.failedFuture(new PulsarClientException.NotConnectedException()); } return internalReceiveAsync(); }
return FutureUtil.failedFuture( new PulsarClientException.AlreadyClosedException("Topics Consumer was already closed")); .map(ConsumerImpl::unsubscribeAsync).collect(Collectors.toList()); FutureUtil.waitForAll(futureList) .whenComplete((r, ex) -> { if (ex == null) {
FutureUtil.waitForAll(futures) .thenAccept(finalFuture -> { try {
public CompletableFuture<PartitionedTopicMetadata> getPartitionedTopicMetadata(String topic) { CompletableFuture<PartitionedTopicMetadata> metadataFuture; try { TopicName topicName = TopicName.get(topic); metadataFuture = lookup.getPartitionedTopicMetadata(topicName); } catch (IllegalArgumentException e) { return FutureUtil.failedFuture(new PulsarClientException.InvalidConfigurationException(e.getMessage())); } return metadataFuture; }
@Override public CompletableFuture<Void> unsubscribeAsync() { if (getState() == State.Closing || getState() == State.Closed) { return FutureUtil.failedFuture( new PulsarClientException.AlreadyClosedException("Topics Consumer was already closed")); } setState(State.Closing); CompletableFuture<Void> unsubscribeFuture = new CompletableFuture<>(); List<CompletableFuture<Void>> futureList = consumers.values().stream() .map(c -> c.unsubscribeAsync()).collect(Collectors.toList()); FutureUtil.waitForAll(futureList) .whenComplete((r, ex) -> { if (ex == null) { setState(State.Closed); unAckedMessageTracker.close(); unsubscribeFuture.complete(null); log.info("[{}] [{}] [{}] Unsubscribed Topics Consumer", topic, subscription, consumerName); } else { setState(State.Failed); unsubscribeFuture.completeExceptionally(ex); log.error("[{}] [{}] [{}] Could not unsubscribe Topics Consumer", topic, subscription, consumerName, ex.getCause()); } }); return unsubscribeFuture; }
/** * Send a request to multiple hosts and wait for all responses */ private void sendPost(List<String> hosts, String path, byte[] body) { FutureUtil.waitForAll(hosts.stream().map(w -> sendPost(w, path, body)).collect(toList())).join(); }
@Override public CompletableFuture<Void> acknowledgeCumulativeAsync(Message<?> message) { try { return acknowledgeCumulativeAsync(message.getMessageId()); } catch (NullPointerException npe) { return FutureUtil.failedFuture(new PulsarClientException.InvalidMessageException(npe.getMessage())); } }
private <T> List<T> get(List<String> hosts, String path, Class<T> clazz) { List<CompletableFuture<T>> futures = hosts.stream().map(w -> get(w, path, clazz)).collect(toList()); CompletableFuture<List<T>> resultFuture = new CompletableFuture<>(); FutureUtil.waitForAll(futures).thenRun(() -> { resultFuture.complete(futures.stream().map(CompletableFuture::join).collect(toList())); }).exceptionally(ex -> { resultFuture.completeExceptionally(ex); return null; }); return resultFuture.join(); }
@Override public CompletableFuture<Producer<T>> createAsync() { if (conf.getTopicName() == null) { return FutureUtil .failedFuture(new IllegalArgumentException("Topic name must be set on the producer builder")); } try { setMessageRoutingMode(); } catch(PulsarClientException pce) { return FutureUtil.failedFuture(pce); } return interceptorList == null || interceptorList.size() == 0 ? client.createProducerAsync(conf, schema, null) : client.createProducerAsync(conf, schema, new ProducerInterceptors<>(interceptorList)); }
public CompletableFuture<Void> stopReplProducers() { List<CompletableFuture<Void>> closeFutures = Lists.newArrayList(); replicators.forEach((region, replicator) -> closeFutures.add(replicator.disconnect())); return FutureUtil.waitForAll(closeFutures); }
@Override public CompletableFuture<Void> acknowledgeAsync(Message<?> message) { try { return acknowledgeAsync(message.getMessageId()); } catch (NullPointerException npe) { return FutureUtil.failedFuture(new PulsarClientException.InvalidMessageException(npe.getMessage())); } }
private synchronized CompletableFuture<Void> closeReplProducersIfNoBacklog() { List<CompletableFuture<Void>> closeFutures = Lists.newArrayList(); replicators.forEach((region, replicator) -> closeFutures.add(replicator.disconnect(true))); return FutureUtil.waitForAll(closeFutures); }
public CompletableFuture<Void> subscribeAsync(String topicName) { if (!topicNameValid(topicName)) { return FutureUtil.failedFuture( new PulsarClientException.AlreadyClosedException("Topic name not valid")); } if (getState() == State.Closing || getState() == State.Closed) { return FutureUtil.failedFuture( new PulsarClientException.AlreadyClosedException("Topics Consumer was already closed")); } CompletableFuture<Void> subscribeResult = new CompletableFuture<>(); client.getPartitionedTopicMetadata(topicName) .thenAccept(metadata -> subscribeTopicPartitions(subscribeResult, topicName, metadata.partitions)) .exceptionally(ex1 -> { log.warn("[{}] Failed to get partitioned topic metadata: {}", topicName, ex1.getMessage()); subscribeResult.completeExceptionally(ex1); return null; }); return subscribeResult; }