@Override protected void processDelivery(Delivery delivery) { final MessageDelivery md = (MessageDelivery) delivery.getContext(); if (delivery.remotelySettled()) { if (delivery.getTag().length > 0) { checkinTag(delivery.getTag()); } final DeliveryState state = delivery.getRemoteState(); if (state == null || state instanceof Accepted) { if (!delivery.remotelySettled()) { delivery.disposition(new Accepted()); } } else if (state instanceof Rejected) { // re-deliver /w incremented delivery counter. md.delivery = null; md.incrementDeliveryCount(); outbound.addLast(md); } else if (state instanceof Released) { // re-deliver && don't increment the counter. md.delivery = null; outbound.addLast(md); } else if (state instanceof Modified) { Modified modified = (Modified) state; if (modified.getDeliveryFailed()) { // increment delivery counter.. md.incrementDeliveryCount(); } } delivery.settle(); } md.fireWatches(); }
protected void pumpDeliveries() { assertExecuting(); try { while (true) { while (currentBuffer != null) { if (sender.getCredit() > 0) { int sent = sender.send(currentBuffer.data, currentBuffer.offset, currentBuffer.length); currentBuffer.moveHead(sent); if (currentBuffer.length == 0) { Delivery current = currentDelivery; MessageDelivery md = (MessageDelivery) current.getContext(); currentBuffer = null; currentDelivery = null; if (qos == QoS.AT_MOST_ONCE) { current.settle(); } else { sender.advance(); } md.fireWatches(); } } else { return; } } if (outbound.isEmpty()) { return; } final MessageDelivery md = outbound.removeFirst(); outboundBufferSize -= md.initialSize; currentBuffer = md.encoded(); if (qos == QoS.AT_MOST_ONCE) { currentDelivery = sender.delivery(EMPTY_BYTE_ARRAY, 0, 0); } else { final byte[] tag = nextTag(); currentDelivery = sender.delivery(tag, 0, tag.length); } md.delivery = currentDelivery; currentDelivery.setContext(md); } } finally { fireWatches(); } }
@Override public Object getContext() { return delivery.getContext(); }