@Override public void onMessage(Delivery delivery) throws ActiveMQAMQPException { if (delivery.getRemoteState() instanceof Accepted) { if (delivery.getContext() instanceof FutureRunnable) { ((FutureRunnable) delivery.getContext()).countDown(); } } }
public void addDelivery(Delivery delivery, ProtonServerSenderContext context) { deliveries.put(((MessageReference) delivery.getContext()), new Pair<>(delivery, context)); }
public void addDelivery(Delivery delivery, ProtonServerSenderContext context) { deliveries.put(((MessageReference) delivery.getContext()), new Pair<>(delivery, context)); }
@Override public void rollback(LocalTransactionId txnId) throws Exception { synchronized (outbound) { LOG.trace("Rolling back {} messages for redelivery. ", dispatchedInTx.size()); for (Delivery delivery : dispatchedInTx) { // Only settled deliveries should be re-dispatched, unsettled deliveries // remain acquired on the remote end and can be accepted again in a new // TX or released or rejected etc. MessageDispatch dispatch = (MessageDispatch) delivery.getContext(); dispatch.getMessage().setTransactionId(null); if (delivery.remotelySettled()) { dispatch.setRedeliveryCounter(dispatch.getRedeliveryCounter() + 1); outbound.addFirst(dispatch); } } dispatchedInTx.clear(); } }
private void releasePrefetch() { Delivery delivery = getEndpoint().head(); while (delivery != null) { Delivery current = delivery; delivery = delivery.next(); if (current.getContext() instanceof JmsInboundMessageDispatch) { JmsInboundMessageDispatch envelope = (JmsInboundMessageDispatch) current.getContext(); if (!envelope.isDelivered()) { handleDisposition(envelope, current, Released.getInstance()); } } else { LOG.debug("{} Found incomplete delivery with no context during release processing", AmqpConsumer.this); } } }
@Override public void rollback(LocalTransactionId txnId) throws Exception { synchronized (outbound) { LOG.trace("Rolling back {} messages for redelivery. ", dispatchedInTx.size()); for (Delivery delivery : dispatchedInTx) { // Only settled deliveries should be re-dispatched, unsettled deliveries // remain acquired on the remote end and can be accepted again in a new // TX or released or rejected etc. MessageDispatch dispatch = (MessageDispatch) delivery.getContext(); dispatch.getMessage().setTransactionId(null); if (delivery.remotelySettled()) { dispatch.setRedeliveryCounter(dispatch.getRedeliveryCounter() + 1); outbound.addFirst(dispatch); } } dispatchedInTx.clear(); } }
private void releasePrefetch() { Delivery delivery = getEndpoint().head(); while (delivery != null) { Delivery current = delivery; delivery = delivery.next(); if (current.getContext() instanceof JmsInboundMessageDispatch) { JmsInboundMessageDispatch envelope = (JmsInboundMessageDispatch) current.getContext(); if (!envelope.isDelivered()) { handleDisposition(envelope, current, Released.getInstance()); } } else { LOG.debug("{} Found incomplete delivery with no context during release processing", AmqpConsumer.this); } } }
@Override public void processDeliveryUpdates(AmqpProvider provider, Delivery delivery) throws IOException { DeliveryState state = delivery.getRemoteState(); if (state != null) { InFlightSend send = (InFlightSend) delivery.getContext(); if (state.getType() == DeliveryStateType.Accepted) { LOG.trace("Outcome of delivery was accepted: {}", delivery); send.onSuccess(); } else { applyDeliveryStateUpdate(send, delivery, state); } } super.processDeliveryUpdates(provider, delivery); }
@Override public void processDeliveryUpdates(AmqpProvider provider, Delivery delivery) throws IOException { DeliveryState state = delivery.getRemoteState(); if (state != null) { InFlightSend send = (InFlightSend) delivery.getContext(); if (state.getType() == DeliveryStateType.Accepted) { LOG.trace("Outcome of delivery was accepted: {}", delivery); send.onSuccess(); } else { applyDeliveryStateUpdate(send, delivery, state); } } super.processDeliveryUpdates(provider, delivery); }
@Override public void commit(LocalTransactionId txnId) throws Exception { if (!dispatchedInTx.isEmpty()) { for (final Delivery delivery : dispatchedInTx) { MessageDispatch dispatch = (MessageDispatch) delivery.getContext(); MessageAck pendingTxAck = new MessageAck(dispatch, MessageAck.INDIVIDUAL_ACK_TYPE, 1); pendingTxAck.setFirstMessageId(dispatch.getMessage().getMessageId()); pendingTxAck.setTransactionId(txnId); LOG.trace("Sending commit Ack to ActiveMQ: {}", pendingTxAck); sendToActiveMQ(pendingTxAck, new ResponseHandler() { @Override public void onResponse(AmqpProtocolConverter converter, Response response) throws IOException { if (response.isException()) { Throwable exception = ((ExceptionResponse) response).getException(); exception.printStackTrace(); getEndpoint().close(); } else { delivery.settle(); } session.pumpProtonToSocket(); } }); } dispatchedInTx.clear(); } }
@Override public void commit(LocalTransactionId txnId) throws Exception { if (!dispatchedInTx.isEmpty()) { for (final Delivery delivery : dispatchedInTx) { MessageDispatch dispatch = (MessageDispatch) delivery.getContext(); MessageAck pendingTxAck = new MessageAck(dispatch, MessageAck.INDIVIDUAL_ACK_TYPE, 1); pendingTxAck.setFirstMessageId(dispatch.getMessage().getMessageId()); pendingTxAck.setTransactionId(txnId); LOG.trace("Sending commit Ack to ActiveMQ: {}", pendingTxAck); sendToActiveMQ(pendingTxAck, new ResponseHandler() { @Override public void onResponse(AmqpProtocolConverter converter, Response response) throws IOException { if (response.isException()) { Throwable exception = ((ExceptionResponse) response).getException(); exception.printStackTrace(); getEndpoint().close(); } else { delivery.settle(); } session.pumpProtonToSocket(); } }); } dispatchedInTx.clear(); } }
delivery = delivery.next(); if (!(current.getContext() instanceof JmsInboundMessageDispatch)) { LOG.debug("{} Found incomplete delivery with no context during recover processing", AmqpConsumer.this); continue; JmsInboundMessageDispatch envelope = (JmsInboundMessageDispatch) current.getContext(); if (envelope.isDelivered()) { envelope.getMessage().getFacade().setRedeliveryCount(
private void reclaimLink(Link link) { if (link instanceof Receiver) { int credit = link.getCredit(); if (credit > 0) { _credit += credit; _distributed -= credit; } } Iterator<Delivery> dIter = link.unsettled(); while (dIter != null && dIter.hasNext()) { Delivery delivery = (Delivery) dIter.next(); StoreEntry entry = (StoreEntry) delivery.getContext(); if (entry != null) { entry.setDelivery(null); if (delivery.isBuffered()) entry.setStatus(Status.ABORTED); } } linkRemoved(link); }
@Override public void closeResource(AmqpProvider provider, Throwable cause, boolean localClose) { // Alert any pending operation that the link failed to complete the pending // begin / commit / rollback operation. Delivery pending = getEndpoint().head(); while (pending != null) { Delivery nextPending = pending.next(); if (pending.getContext() != null && pending.getContext() instanceof OperationContext) { OperationContext context = (OperationContext) pending.getContext(); context.request.onFailure(cause); } pending = nextPending; } // Override the base class version because we do not want to propagate // an error up to the client if remote close happens as that is an // acceptable way for the remote to indicate the discharge could not // be applied. if (getParent() != null) { getParent().removeChildResource(this); } if (getEndpoint() != null) { getEndpoint().close(); getEndpoint().free(); } LOG.debug("Transaction Coordinator link {} was remotely closed", getResourceInfo()); }
@Override public void closeResource(AmqpProvider provider, Throwable cause, boolean localClose) { // Alert any pending operation that the link failed to complete the pending // begin / commit / rollback operation. Delivery pending = getEndpoint().head(); while (pending != null) { Delivery nextPending = pending.next(); if (pending.getContext() != null && pending.getContext() instanceof OperationContext) { OperationContext context = (OperationContext) pending.getContext(); context.request.onFailure(cause); } pending = nextPending; } // Override the base class version because we do not want to propagate // an error up to the client if remote close happens as that is an // acceptable way for the remote to indicate the discharge could not // be applied. if (getParent() != null) { getParent().removeChildResource(this); } if (getEndpoint() != null) { getEndpoint().close(); getEndpoint().free(); } LOG.debug("Transaction Coordinator link {} was remotely closed", getResourceInfo()); }
Message message = ((MessageReference) delivery.getContext()).getMessage(); DeliveryState remoteState = delivery.getRemoteState();
private void reclaimLink(Link link) { if (link instanceof Receiver) { int credit = link.getCredit(); if (credit > 0) { _credit += credit; _distributed -= credit; } } Delivery delivery = link.head(); while (delivery != null) { StoreEntry entry = (StoreEntry) delivery.getContext(); if (entry != null) { entry.setDelivery(null); if (delivery.isBuffered()) { entry.setStatus(Status.ABORTED); } } delivery = delivery.next(); } linkRemoved(link); }
if( currentBuffer.length == 0 ) { Delivery current = currentDelivery; MessageDelivery md = (MessageDelivery) current.getContext(); currentBuffer = null; currentDelivery = null;
@Override protected void processDelivery(Delivery delivery) { final MessageDelivery md = (MessageDelivery) delivery.getContext(); if( delivery.remotelySettled() ) { if( delivery.getTag().length > 0 ) {
onMessageDispatch((MessageDispatch) delivery.getContext()); } else { MessageDispatch md = (MessageDispatch) delivery.getContext(); lastDeliveredSequenceId = md.getMessage().getMessageId().getBrokerSequenceId(); MessageAck ack = new MessageAck();