@Override public void close() throws IOException { if (consumer != null) { if (!this.service.removeConsumer(this)) { log.warn("[{}] Failed to remove consumer handler", consumer.getTopic()); } consumer.closeAsync().thenAccept(x -> { if (log.isDebugEnabled()) { log.debug("[{}] Closed consumer asynchronously", consumer.getTopic()); } }).exceptionally(exception -> { log.warn("[{}] Failed to close consumer", consumer.getTopic(), exception); return null; }); } }
public void start() throws Exception { Producer producer = getNewProducer(); final Consumer consumer = consumerFuture.get(); while (!stop.get()) { final MutableBoolean wellnessFlag = new MutableBoolean(); final Function<Throwable, ? extends MessageId> exceptionHandler = e -> { // Unset the well flag in the case of an exception so we can // try to get a new Producer. wellnessFlag.value = false; return null; }; while (!stop.get() && wellnessFlag.value) { producer.sendAsync(payload.get()).exceptionally(exceptionHandler); rateLimiter.acquire(); } producer.closeAsync(); if (!stop.get()) { // The Producer failed due to an exception: attempt to get // another producer. producer = getNewProducer(); } else { // We are finished: close the consumer. consumer.closeAsync(); } } } }