@Override public void replenish(final int downstreamCredit) { int remainingCredit = link.getCredit(); if (downstreamCredit > 0 && remainingCredit <= MIN_LINK_CREDIT) { int credit = Math.min(MAX_LINK_CREDIT, downstreamCredit); LOG.debug("replenishing client [{}] with {} credits", id, credit); link.flow(credit); } else { // link has remaining credit, no need to replenish yet } }
private void flowCreditToRequestor(final String replyTo) { final ProtonReceiver receiver = replyToReceiverMap.get(replyTo); if (receiver == null) { logger.warn("No receiver found for reply-to address [{}]", replyTo); return; } // flow one credit back to the receiver receiver.flow(1); if (logger.isTraceEnabled()) { logger.trace("Flowing credit back to sender - replyTo: [{}], currentCredits: {}", replyTo, receiver.getCredit()); } }
private void flowCreditToRequestor(final String replyTo) { final ProtonReceiver receiver = replyToReceiverMap.get(replyTo); if (receiver == null) { logger.warn("No receiver found for reply-to address [{}]", replyTo); return; } // flow one credit back to the receiver receiver.flow(1); if (logger.isTraceEnabled()) { logger.trace("Flowing credit back to sender - replyTo: [{}], currentCredits: {}", replyTo, receiver.getCredit()); } }
@Override public int getRemainingCredit() { return receiver.getCredit() - receiver.getQueued(); }
private void flowCreditIfNeeded(long n) { int currentCredit = receiver.getCredit(); if(currentCredit < maxOutstandingCredit) { int limit = maxOutstandingCredit - currentCredit; int addedCredit = (int) Math.min(n, limit); if(addedCredit > 0) { if(!completed.get()) { LOG.trace("Flowing additional credits : {0}", addedCredit); receiver.flow(addedCredit); } else { LOG.trace("Skipping flowing additional credits as already completed: {0}", addedCredit); } } } }
private boolean onNextWrapper(Delivery next) { if(!completed.get() && !cancelled.get()){ LOG.trace("calling onNext"); subcriber.onNext(next); // Now top up credits if still needed outstandingRequests = outstandingRequests - 1; if(!cancelled.get()) { int currentCredit = receiver.getCredit(); if(currentCredit < (maxOutstandingCredit * 0.5) && outstandingRequests > currentCredit) { int creditLimit = (int) Math.min(outstandingRequests, maxOutstandingCredit); int credits = creditLimit - currentCredit; if(credits > 0) { LOG.trace("Updating credit for outstanding requests: {0}", credits); flowCreditIfNeeded(credits); } } } return true; } else { LOG.trace("skipped calling onNext, already completed or cancelled"); return false; } }
private void forwardMessage(ProtonSender protonSender, ProtonReceiver protonReceiver, ProtonDelivery sourceDelivery, Message message) { MessageAnnotations annotations = message.getMessageAnnotations(); if (annotations == null) { annotations = new MessageAnnotations(Collections.singletonMap(replicated, true)); } else { annotations.getValue().put(replicated, true); } message.setMessageAnnotations(annotations); protonSender.send(message, protonDelivery -> { sourceDelivery.disposition(protonDelivery.getRemoteState(), protonDelivery.remotelySettled()); protonReceiver.flow(protonSender.getCredit() - protonReceiver.getCredit()); }); }
messageHandler.handle(delivery, message); if (LOG.isTraceEnabled()) { final int remainingCredits = receiver.getCredit() - receiver.getQueued(); LOG.trace("handling message [remotely settled: {}, queued messages: {}, remaining credit: {}]", delivery.remotelySettled(), receiver.getQueued(), remainingCredits);