/** * Update link state to reflect that the previous drain attempt has completed. */ public void reportDrained() { connection.requireInHandler(); sender.drained(); connection.flush(); } }
/** * Update link state to reflect that the previous drain attempt has completed. */ public void reportDrained() { connection.lock(); try { sender.drained(); } finally { connection.unlock(); } connection.flush(); } }
private int pumpOut( String address, Sender sender ) { StoreEntry entry = _outgoingStore.get( address ); if (entry == null) { sender.drained(); return 0; } byte[] tag = String.valueOf(_nextTag++).getBytes(); Delivery delivery = sender.delivery(tag); entry.setDelivery( delivery ); _logger.log(Level.FINE, "Sending on delivery: " + delivery); int n = sender.send( entry.getEncodedMsg(), 0, entry.getEncodedLength()); if (n < 0) { _outgoingStore.freeEntry( entry ); _logger.log(Level.WARNING, "Send error: " + n); return n; } else { sender.advance(); _outgoingStore.freeEntry( entry ); return 0; } }
private int pumpOut( String address, Sender sender ) { StoreEntry entry = _outgoingStore.get( address ); if (entry == null) { sender.drained(); return 0; } byte[] tag = String.valueOf(_nextTag++).getBytes(); Delivery delivery = sender.delivery(tag); entry.setDelivery( delivery ); _logger.log(Level.FINE, "Sending on delivery: " + delivery); int n = sender.send( entry.getEncodedMsg(), 0, entry.getEncodedLength()); if (n < 0) { _outgoingStore.freeEntry( entry ); _logger.log(Level.WARNING, "Send error: " + n); return n; } else { sender.advance(); _outgoingStore.freeEntry( entry ); return 0; } }
@Override public void processFlowUpdates(AmqpProvider provider) throws IOException { if (!blocked.isEmpty() && getEndpoint().getCredit() > 0) { Iterator<InFlightSend> blockedSends = blocked.values().iterator(); while (getEndpoint().getCredit() > 0 && blockedSends.hasNext()) { LOG.trace("Dispatching previously held send"); InFlightSend held = blockedSends.next(); try { // If the transaction has failed due to remote termination etc then we just indicate // the send has succeeded until the a new transaction is started. if (session.isTransacted() && session.isTransactionFailed()) { held.onSuccess(); return; } doSend(held.getEnvelope(), held); } catch (JMSException e) { throw IOExceptionSupport.create(e); } finally { blockedSends.remove(); } } } // If a drain was requested, we just sent what we had so respond with drained if (getEndpoint().getDrain()) { getEndpoint().drained(); } super.processFlowUpdates(provider); }
@Override public void processFlowUpdates(AmqpProvider provider) throws IOException { if (!blocked.isEmpty() && getEndpoint().getCredit() > 0) { Iterator<InFlightSend> blockedSends = blocked.values().iterator(); while (getEndpoint().getCredit() > 0 && blockedSends.hasNext()) { LOG.trace("Dispatching previously held send"); InFlightSend held = blockedSends.next(); try { // If the transaction has failed due to remote termination etc then we just indicate // the send has succeeded until the a new transaction is started. if (session.isTransacted() && session.isTransactionFailed()) { held.onSuccess(); return; } doSend(held.getEnvelope(), held); } catch (JMSException e) { throw IOExceptionSupport.create(e); } finally { blockedSends.remove(); } } } // If a drain was requested, we just sent what we had so respond with drained if (getEndpoint().getDrain()) { getEndpoint().drained(); } super.processFlowUpdates(provider); }
getEndpoint().drained(); session.pumpProtonToSocket(); currentCreditRequest = 0;
getEndpoint().drained(); session.pumpProtonToSocket(); currentCreditRequest = 0;