@Override public boolean remotelySettled() { return delivery.remotelySettled(); }
void fireUpdate() { if (this.handler != null) { this.handler.handle(this); } if (autoSettle && delivery.remotelySettled() && !delivery.isSettled()) { settle(); } }
@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(); } }
@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 completePendingUpdateStateWorkItem(Delivery delivery, String deliveryTagAsString, UpdateStateWorkItem workItem, Exception exception) { boolean isSettled = delivery.remotelySettled(); if (isSettled) { delivery.settle(); } if(exception == null) { AsyncUtil.completeFuture(workItem.getWork(), null); } else { ExceptionUtil.completeExceptionally(workItem.getWork(), exception, this, true); } if (isSettled) { this.tagsToDeliveriesMap.remove(deliveryTagAsString); this.pendingUpdateStateRequests.remove(deliveryTagAsString); } }
@Override public void inspectDeliveryUpdate(Sender sender, Delivery delivery) { if (delivery.remotelySettled()) { IntegrationTestLogger.LOGGER.trace("Remote settled message for sender: " + sender.getName()); settled.countDown(); } } });
@Override public void inspectDeliveryUpdate(Sender sender, Delivery delivery) { if (delivery.remotelySettled()) { DeliveryState state = delivery.getRemoteState(); if (state instanceof TransactionalState) { LOG.debug("Remote settled with TX state: {}", state); } else { LOG.warn("Remote settled with non-TX state: {}", state); markAsInvalid("Remote did not settled with TransactionState."); } } } });
boolean checkSettled(Iterator<Delivery> unsettled) { if (unsettled != null) { while (unsettled.hasNext()) { Delivery d = unsettled.next(); if (d == null) { break; } if (d.getRemoteState() != null || d.remotelySettled()) { d.settle(); } else if (d.getLink().getSession().getConnection().getRemoteState() == EndpointState.CLOSED) { continue; } else { return false; } } } return true; } }
@Override public void rollbackRedelivery(Transaction txn, MessageReference ref, long timeBase, Map<QueueImpl, LinkedList<MessageReference>> queueMap) throws Exception { ProtonTransactionImpl tx = (ProtonTransactionImpl) txn; if (tx.getDeliveries().containsKey(ref)) { Delivery del = tx.getDeliveries().get(ref).getA(); ServerConsumer consumer = (ServerConsumer) tx.getDeliveries().get(ref).getB().getBrokerConsumer(); // Rollback normally if the delivery is not settled or a forced TX rollback is done (e.g. connection drop). if (del.remotelySettled() || !tx.isDischarged()) { super.rollbackRedelivery(tx, ref, timeBase, queueMap); } else { ref.incrementDeliveryCount(); consumer.backToDelivering(ref); del.disposition(del.getLocalState() == null ? del.getDefaultDeliveryState() : del.getLocalState()); } } else { super.rollbackRedelivery(tx, ref, timeBase, queueMap); } } }
Status getStatus(Tracker tracker) { Delivery delivery = getDelivery(tracker); if (delivery != null) { DeliveryState state = delivery.getRemoteState(); if (state != null) { return getStatus(state); } else if (delivery.remotelySettled() || delivery.isSettled()) { return getStatus(delivery.getLocalState()); } else { return Status.PENDING; } } else { return Status.UNKNOWN; } }
public void updated() { if (_delivery != null) { if (_delivery.getRemoteState() != null) { _status = _disp2status(_delivery.getRemoteState()); } else if (_delivery.remotelySettled()) { DeliveryState disp = _delivery.getLocalState(); if (disp == null) { _status = Status.SETTLED; } else { _status = _disp2status(_delivery.getLocalState()); } } else { _status = Status.PENDING; } } }
public void updated() { if (_delivery != null) { if (_delivery.getRemoteState() != null) { _status = _disp2status(_delivery.getRemoteState()); } else if (_delivery.remotelySettled()) { DeliveryState disp = _delivery.getLocalState(); if (disp == null) { _status = Status.SETTLED; } else { _status = _disp2status(_delivery.getLocalState()); } } else { _status = Status.PENDING; } } }
@Override public void rollbackRedelivery(Transaction txn, MessageReference ref, long timeBase, Map<QueueImpl, LinkedList<MessageReference>> queueMap) throws Exception { ProtonTransactionImpl tx = (ProtonTransactionImpl) txn; if (tx.getDeliveries().containsKey(ref)) { Delivery del = tx.getDeliveries().get(ref).getA(); ServerConsumer consumer = (ServerConsumer) tx.getDeliveries().get(ref).getB().getBrokerConsumer(); // Rollback normally if the delivery is not settled or a forced TX rollback is done (e.g. connection drop). if (del.remotelySettled() || !tx.isDischarged()) { super.rollbackRedelivery(tx, ref, timeBase, queueMap); } else { ref.incrementDeliveryCount(); consumer.backToDelivering(ref); del.disposition(del.getLocalState() == null ? del.getDefaultDeliveryState() : del.getLocalState()); } } else { super.rollbackRedelivery(tx, ref, timeBase, queueMap); } } }
private void handleAccepted(JmsInboundMessageDispatch envelope, Delivery delivery) { LOG.debug("Accepted Ack of message: {}", envelope); if (!delivery.remotelySettled()) { if (session.isTransacted() && !getResourceInfo().isBrowser()) { if (session.isTransactionFailed()) { LOG.trace("Skipping ack of message {} in failed transaction.", envelope); return; } Binary txnId = session.getTransactionContext().getAmqpTransactionId(); if (txnId != null) { delivery.disposition(session.getTransactionContext().getTxnAcceptState()); delivery.settle(); session.getTransactionContext().registerTxConsumer(this); } } else { delivery.disposition(Accepted.getInstance()); delivery.settle(); } } else { delivery.settle(); } if (envelope.isDelivered()) { deliveredCount--; } dispatchedCount--; }
private void handleAccepted(JmsInboundMessageDispatch envelope, Delivery delivery) { LOG.debug("Accepted Ack of message: {}", envelope); if (!delivery.remotelySettled()) { if (session.isTransacted() && !getResourceInfo().isBrowser()) { if (session.isTransactionFailed()) { LOG.trace("Skipping ack of message {} in failed transaction.", envelope); return; } Binary txnId = session.getTransactionContext().getAmqpTransactionId(); if (txnId != null) { delivery.disposition(session.getTransactionContext().getTxnAcceptState()); delivery.settle(); session.getTransactionContext().registerTxConsumer(this); } } else { delivery.disposition(Accepted.getInstance()); delivery.settle(); } } else { delivery.settle(); } if (envelope.isDelivered()) { deliveredCount--; } dispatchedCount--; }
@Override public void inspectDeliveryUpdate(Sender sender, Delivery delivery) { DeliveryState state = delivery.getRemoteState(); if (!delivery.remotelySettled()) { markAsInvalid("delivery is not remotely settled"); } if (state instanceof Rejected) { Rejected rejected = (Rejected) state; if (rejected.getError() == null || rejected.getError().getCondition() == null) { markAsInvalid("Delivery should have been Rejected with an error condition"); } else { ErrorCondition error = rejected.getError(); if (!error.getCondition().equals(AmqpError.UNAUTHORIZED_ACCESS)) { markAsInvalid("Should have been tagged with unauthorized access error"); } } } else { markAsInvalid("Delivery should have been Rejected"); } latch.countDown(); } });
@Override public void onResponse(AmqpProtocolConverter converter, Response response) throws IOException { if (!delivery.remotelySettled()) { if (response.isException()) { ExceptionResponse error = (ExceptionResponse) response;
@Override public void inspectDeliveryUpdate(Sender sender, Delivery delivery) { if (delivery.remotelySettled()) { LOG.info("Receiver got delivery update for: {}", delivery); if (!(delivery.getRemoteState() instanceof TransactionalState)) {
private void doTestPresettledReceiverWithinBoundsOfActiveTX(boolean commit) throws Exception { AmqpClient client = createAmqpClient(); AmqpConnection connection = addConnection(client.connect()); AmqpSession session = connection.createSession(); AmqpSender sender = session.createSender(getQueueName()); final Queue queue = getProxyToQueue(getQueueName()); AmqpMessage message = new AmqpMessage(); message.setText("Test-Message"); sender.send(message); Wait.assertEquals(1, queue::getMessageCount); AmqpReceiver receiver = session.createReceiver(getQueueName(), null, false, true); session.begin(); receiver.flow(1); AmqpMessage received = receiver.receive(5, TimeUnit.SECONDS); assertNotNull(received); assertTrue(received.getWrappedDelivery().remotelySettled()); if (commit) { session.commit(); } else { session.rollback(); } assertEquals(0, queue.getMessageCount()); sender.close(); connection.close(); }
AmqpMessage received = receiver.receive(5, TimeUnit.SECONDS); assertNotNull(received); assertTrue(received.getWrappedDelivery().remotelySettled());