@Override protected Message internalReceive(int timeout, TimeUnit unit) throws PulsarClientException { Message message; try { message = incomingMessages.poll(timeout, unit); if (message != null) { messageProcessed(message); } return message; } catch (InterruptedException e) { Thread.currentThread().interrupt(); stats.incrementNumReceiveFailed(); throw new PulsarClientException(e); } }
/** * Notify waiting asyncReceive request with the received message * * @param message */ void notifyPendingReceivedCallback(final MessageImpl message, Exception exception) { if (!pendingReceives.isEmpty()) { // fetch receivedCallback from queue CompletableFuture<Message> receivedFuture = pendingReceives.poll(); if (exception == null) { checkNotNull(message, "received message can't be null"); if (receivedFuture != null) { if (conf.getReceiverQueueSize() == 0) { // return message to receivedCallback receivedFuture.complete(message); } else { // increase permits for available message-queue messageProcessed(message); // return message to receivedCallback listenerExecutor.execute(() -> receivedFuture.complete(message)); } } } else { listenerExecutor.execute(() -> receivedFuture.completeExceptionally(exception)); } } }
@Override protected CompletableFuture<Message> internalReceiveAsync() { CompletableFuture<Message> result = new CompletableFuture<Message>(); Message message = null; try { lock.writeLock().lock(); message = incomingMessages.poll(0, TimeUnit.MILLISECONDS); if (message == null) { pendingReceives.add(result); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); result.completeExceptionally(e); } finally { lock.writeLock().unlock(); } if (message == null && conf.getReceiverQueueSize() == 0) { sendFlowPermitsToBroker(cnx(), 1); } else if (message != null) { messageProcessed(message); result.complete(message); } return result; }
@Override protected Message internalReceive() throws PulsarClientException { if (conf.getReceiverQueueSize() == 0) { checkArgument(zeroQueueLock != null, "Receiver queue size can't be modified"); zeroQueueLock.writeLock().lock(); try { return fetchSingleMessageFromBroker(); } finally { zeroQueueLock.writeLock().unlock(); } } Message message; try { message = incomingMessages.take(); messageProcessed(message); return message; } catch (InterruptedException e) { Thread.currentThread().interrupt(); stats.incrementNumReceiveFailed(); throw new PulsarClientException(e); } }