@Override public void promptDelivery() { // largeMessageDeliverer is always set inside a lock // if we don't acquire a lock, we will have NPE eventually if (largeMessageDeliverer != null) { resumeLargeMessage(); } else { forceDelivery(); } }
public void onFlowConsumer(Object consumer, int credits, final boolean drain) { ServerConsumerImpl serverConsumer = (ServerConsumerImpl) consumer; if (drain) { // If the draining is already running, then don't do anything if (draining.compareAndSet(false, true)) { final ProtonServerSenderContext plugSender = (ProtonServerSenderContext) serverConsumer.getProtocolContext(); serverConsumer.forceDelivery(1, new Runnable() { @Override public void run() { try { plugSender.reportDrained(); } finally { draining.set(false); } } }); } } else { serverConsumer.receiveCredits(-1); } }
@Override public void onFlow(int currentCredits, boolean drain) { connection.requireInHandler(); setupCredit(); ServerConsumerImpl serverConsumer = (ServerConsumerImpl) brokerConsumer; if (drain) { // If the draining is already running, then don't do anything if (draining.compareAndSet(false, true)) { final ProtonServerSenderContext plugSender = (ProtonServerSenderContext) serverConsumer.getProtocolContext(); serverConsumer.forceDelivery(1, new Runnable() { @Override public void run() { try { connection.runNow(() -> { plugSender.reportDrained(); setupCredit(); }); } finally { draining.set(false); } } }); } } else { serverConsumer.receiveCredits(-1); } }
/** * Prompt delivery and send a "forced delivery" message to the consumer. * <p> * When the consumer receives such a "forced delivery" message, it discards it and knows that * there are no other messages to be delivered. */ @Override public void forceDelivery(final long sequence) { forceDelivery(sequence, () -> { Message forcedDeliveryMessage = new CoreMessage(storageManager.generateID(), 50); MessageReference reference = MessageReference.Factory.createReference(forcedDeliveryMessage, messageQueue); reference.setDeliveryCount(0); forcedDeliveryMessage.putLongProperty(ClientConsumerImpl.FORCED_DELIVERY_MESSAGE, sequence); forcedDeliveryMessage.setAddress(messageQueue.getName()); applyPrefixForLegacyConsumer(forcedDeliveryMessage); callback.sendMessage(reference, forcedDeliveryMessage, ServerConsumerImpl.this, 0); }); }