/** * Sends a Message on the senderLink * @param tag delivery tag * @param data Data to be sent on the link * @param length Length of the data * @param offset Offset of the data to send */ public void sendMessage(byte[] tag, byte[] data, int length, int offset) { this.senderLink.delivery(tag); this.senderLink.send(data, offset, length); this.senderLink.advance(); }
Delivery dlv = sender.delivery(tag);
public void request( final Message message, final OperationResult<Message, Exception> onResponse) { if (message == null) throw new IllegalArgumentException("message cannot be null"); if (message.getMessageId() != null) throw new IllegalArgumentException("message.getMessageId() should be null"); if (message.getReplyTo() != null) throw new IllegalArgumentException("message.getReplyTo() should be null"); message.setMessageId("request" + UnsignedLong.valueOf(this.requestId.incrementAndGet()).toString()); message.setReplyTo(this.replyTo); this.inflightRequests.put(message.getMessageId(), onResponse); sendLink.delivery(UUID.randomUUID().toString().replace("-", StringUtil.EMPTY).getBytes()); final int payloadSize = AmqpUtil.getDataSerializedSize(message) + 512; // need buffer for headers final byte[] bytes = new byte[payloadSize]; final int encodedSize = message.encode(bytes, 0, payloadSize); receiveLink.flow(1); sendLink.send(bytes, 0, encodedSize); sendLink.advance(); }
Delivery dlv = snd.delivery(tag);
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; } }
Delivery delivery = sender.delivery(tag); int encoded; while (true)
delivery = sender.delivery(tag, 0, tag.length); delivery.setContext(context);
public void declare(AmqpTransactionId txId, AsyncResult request) throws Exception { if (txId.getRemoteTxId() != null) { throw new IllegalStateException("Declare called while a TX is still Active."); } if (isClosed()) { request.onFailure(new JMSException("Cannot start new transaction: Coordinator remotely closed")); return; } Message message = Message.Factory.create(); Declare declare = new Declare(); message.setBody(new AmqpValue(declare)); Delivery pendingDelivery = getEndpoint().delivery(tagGenerator.getNextTag()); pendingDelivery.setContext(txId); // Store away for completion pendingDeliveries.add(pendingDelivery); pendingRequests.put(txId, request); sendTxCommand(message); }
private void doSend(AmqpMessage message, AsyncResult request, AmqpTransactionId txId) throws Exception { LOG.trace("Producer sending message: {}", message); Delivery delivery = null; if (presettle) { delivery = getEndpoint().delivery(EMPTY_BYTE_ARRAY, 0, 0); } else { byte[] tag = tagGenerator.getNextTag(); delivery = getEndpoint().delivery(tag, 0, tag.length); } delivery.setContext(request); Binary amqpTxId = null; if (txId != null) { amqpTxId = txId.getRemoteTxId(); } else if (session.isInTransaction()) { amqpTxId = session.getTransactionId().getRemoteTxId(); } if (amqpTxId != null) { TransactionalState state = new TransactionalState(); state.setTxnId(amqpTxId); delivery.disposition(state); } encodeAndSend(message.getWrappedMessage(), delivery); if (presettle) { delivery.settle(); request.onSuccess(); } else { pending.add(delivery); getEndpoint().advance(); } }
delivery = sender.delivery(tag, 0, tag.length); delivery.setMessageFormat((int) message.getMessageFormat()); delivery.setContext(messageReference);
public void discharge(AmqpTransactionId txId, AsyncResult request, boolean commit) throws Exception { if (isClosed()) { Exception failureCause = null; if (commit) { failureCause = new TransactionRolledBackException("Transaction inbout: Coordinator remotely closed"); } else { failureCause = new JMSException("Rollback cannot complete: Coordinator remotely closed"); } request.onFailure(failureCause); return; } // Store the context of this action in the transaction ID for later completion. txId.setState(commit ? AmqpTransactionId.COMMIT_MARKER : AmqpTransactionId.ROLLBACK_MARKER); Message message = Message.Factory.create(); Discharge discharge = new Discharge(); discharge.setFail(!commit); discharge.setTxnId(txId.getRemoteTxId()); message.setBody(new AmqpValue(discharge)); Delivery pendingDelivery = getEndpoint().delivery(tagGenerator.getNextTag()); pendingDelivery.setContext(txId); // Store away for completion pendingDeliveries.add(pendingDelivery); pendingRequests.put(txId, request); sendTxCommand(message); }
public void declare(JmsTransactionId txId, AsyncResult request) throws Exception { if (isClosed()) { request.onFailure(new JMSException("Cannot start new transaction: Coordinator remotely closed")); return; } if (txId.getProviderHint() != null) { throw new IllegalStateException("Declar called while a TX is still Active."); } Message message = Message.Factory.create(); Declare declare = new Declare(); message.setBody(new AmqpValue(declare)); ScheduledFuture<?> timeout = scheduleTimeoutIfNeeded("Timed out waiting for declare of TX.", request); OperationContext context = new OperationContext(txId, request, timeout); Delivery delivery = getEndpoint().delivery(tagGenerator.getNextTag()); delivery.setContext(context); sendTxCommand(message); }
@Override public ProtonDelivery send(byte[] tag, Message message, Handler<ProtonDelivery> onUpdated) { if (anonymousSender && message.getAddress() == null) { throw new IllegalArgumentException("Message must have an address when using anonymous sender."); } // TODO: prevent odd combination of onRecieved callback + SenderSettleMode.SETTLED, or just allow it? Delivery delivery = sender().delivery(tag); // start a new delivery.. ProtonWritableBufferImpl buffer = new ProtonWritableBufferImpl(); MessageImpl msg = (MessageImpl) message; msg.encode(buffer); ReadableBuffer encoded = new ProtonReadableBufferImpl(buffer.getBuffer()); sender().sendNoCopy(encoded); if (link.getSenderSettleMode() == SenderSettleMode.SETTLED) { delivery.settle(); } sender().advance(); // ends the delivery. ProtonDeliveryImpl protonDeliveryImpl = new ProtonDeliveryImpl(delivery); if (onUpdated != null) { protonDeliveryImpl.setAutoSettle(autoSettle); protonDeliveryImpl.handler(onUpdated); } else { protonDeliveryImpl.setAutoSettle(true); } getSession().getConnectionImpl().flush(); return protonDeliveryImpl; }
public void declare(JmsTransactionId txId, AsyncResult request) throws Exception { if (isClosed()) { request.onFailure(new JMSException("Cannot start new transaction: Coordinator remotely closed")); return; } if (txId.getProviderHint() != null) { throw new IllegalStateException("Declar called while a TX is still Active."); } Message message = Message.Factory.create(); Declare declare = new Declare(); message.setBody(new AmqpValue(declare)); ScheduledFuture<?> timeout = scheduleTimeoutIfNeeded("Timed out waiting for declare of TX.", request); OperationContext context = new OperationContext(txId, request, timeout); Delivery delivery = getEndpoint().delivery(tagGenerator.getNextTag()); delivery.setContext(context); sendTxCommand(message); }
public void discharge(JmsTransactionId txId, DischargeCompletion request) throws Exception { if (isClosed()) { Exception failureCause = null; if (request.isCommit()) { failureCause = new TransactionRolledBackException("Transaction inbout: Coordinator remotely closed"); } else { failureCause = new JMSException("Rollback cannot complete: Coordinator remotely closed"); } request.onFailure(failureCause); return; } if (txId.getProviderHint() == null) { throw new IllegalStateException("Discharge called with no active Transaction."); } // Store the context of this action in the transaction ID for later completion. txId.setProviderContext(request.isCommit() ? COMMIT_MARKER : ROLLBACK_MARKER); Message message = Message.Factory.create(); Discharge discharge = new Discharge(); discharge.setFail(!request.isCommit()); discharge.setTxnId((Binary) txId.getProviderHint()); message.setBody(new AmqpValue(discharge)); ScheduledFuture<?> timeout = scheduleTimeoutIfNeeded("Timed out waiting for discharge of TX.", request); OperationContext context = new OperationContext(txId, request, timeout); Delivery delivery = getEndpoint().delivery(tagGenerator.getNextTag()); delivery.setContext(context); sendTxCommand(message); }
public void discharge(JmsTransactionId txId, DischargeCompletion request) throws Exception { if (isClosed()) { Exception failureCause = null; if (request.isCommit()) { failureCause = new TransactionRolledBackException("Transaction inbout: Coordinator remotely closed"); } else { failureCause = new JMSException("Rollback cannot complete: Coordinator remotely closed"); } request.onFailure(failureCause); return; } if (txId.getProviderHint() == null) { throw new IllegalStateException("Discharge called with no active Transaction."); } // Store the context of this action in the transaction ID for later completion. txId.setProviderContext(request.isCommit() ? COMMIT_MARKER : ROLLBACK_MARKER); Message message = Message.Factory.create(); Discharge discharge = new Discharge(); discharge.setFail(!request.isCommit()); discharge.setTxnId((Binary) txId.getProviderHint()); message.setBody(new AmqpValue(discharge)); ScheduledFuture<?> timeout = scheduleTimeoutIfNeeded("Timed out waiting for discharge of TX.", request); OperationContext context = new OperationContext(txId, request, timeout); Delivery delivery = getEndpoint().delivery(tagGenerator.getNextTag()); delivery.setContext(context); sendTxCommand(message); }