@Override public void onMessage(Delivery delivery) throws ActiveMQAMQPException { connection.requireInHandler(); Receiver receiver = ((Receiver) delivery.getLink()); if (receiver.current() != delivery) { return; } if (delivery.isAborted()) { // Aborting implicitly remotely settles, so advance // receiver to the next delivery and settle locally. receiver.advance(); delivery.settle(); // Replenish the credit if not doing a drain if (!receiver.getDrain()) { receiver.flow(1); } return; } else if (delivery.isPartial()) { return; } ReadableBuffer data = receiver.recv(); receiver.advance(); Transaction tx = null; if (delivery.getRemoteState() instanceof TransactionalState) { TransactionalState txState = (TransactionalState) delivery.getRemoteState(); tx = this.sessionSPI.getTransaction(txState.getTxnId(), false); } final Transaction txUsed = tx; actualDelivery(delivery, receiver, data, txUsed); }
public Receiver create(Session session) { Receiver receiver = session.receiver(_path); Source source = new Source(); source.setAddress(_path); receiver.setSource(source); // the C implemenation does this: Target target = new Target(); target.setAddress(_path); receiver.setTarget(target); if (getIncomingWindow() > 0) { // use explicit settlement via dispositions (not pre-settled) receiver.setSenderSettleMode(SenderSettleMode.UNSETTLED); // desired receiver.setReceiverSettleMode(ReceiverSettleMode.SECOND); } return receiver; } }
public void addReceiver(Receiver receiver) throws Exception { try { AbstractProtonReceiverContext protonReceiver = new ProtonServerReceiverContext(sessionSPI, connection, this, receiver); protonReceiver.initialise(); receivers.put(receiver, protonReceiver); receiver.setContext(protonReceiver); receiver.open(); } catch (ActiveMQAMQPException e) { receivers.remove(receiver); receiver.setTarget(null); receiver.setCondition(new ErrorCondition(e.getAmqpError(), e.getMessage())); receiver.close(); } }
private void sendFlow(int credits) { if(!this.isBrowsableSession && credits > 0) { this.receiveLink.flow(credits); TRACE_LOGGER.debug("Sent flow to the service. receiverPath:{}, linkname:{}, updated-link-credit:{}, sentCredits:{}", this.receivePath, this.receiveLink.getName(), this.receiveLink.getCredit(), credits); } }
public void addTransactionHandler(Coordinator coordinator, Receiver receiver) { ProtonTransactionHandler transactionHandler = new ProtonTransactionHandler(sessionSPI); receiver.setContext(transactionHandler); receiver.open(); receiver.flow(100); }
Delivery delivery = recv.current(); if (delivery.isReadable() && !delivery.isPartial() && delivery.getLink().getName().equals(RECEIVE_TAG)) int size = delivery.pending(); byte[] buffer = new byte[size]; int read = recv.recv(buffer, 0, buffer.length); recv.advance(); recv.getSession().close(); recv.getSession().getConnection().close();
linkReceiver.setSource(source); linkReceiver.setTarget(target); if (sr.qos == QOS.AT_LEAST_ONCE) { linkReceiver.setSenderSettleMode(SenderSettleMode.UNSETTLED); linkReceiver.setReceiverSettleMode(ReceiverSettleMode.FIRST); } else { linkReceiver.setSenderSettleMode(SenderSettleMode.SETTLED); linkReceiver.setReceiverSettleMode(ReceiverSettleMode.FIRST); linkReceiver.open(); linkReceiver.flow(sr.initialCredit); EngineConnection engineConnection = ur.connection; EngineConnection.SubscriptionData sd = engineConnection.subscriptionData.get(ur.topic.toString()); Target t = (Target)sd.receiver.getTarget(); Source s = (Source)sd.receiver.getSource(); sd.receiver.close(); } else { t.getTimeout().longValue() > 0 || ur.topic.isShared()) { sd.receiver.detach(); } else { sd.receiver.close(); if ((available / subData.settled) <= 1.25 || (subData.unsettled == 0 && subData.settled > 0)) { subData.receiver.flow(subData.settled);
Delivery delivery = this.receiverLink.current(); if (linkName.equals(this.receiverLinkTag) && (delivery != null) && delivery.isReadable() && !delivery.isPartial()) int size = delivery.pending(); byte[] buffer = new byte[size]; int read = this.receiverLink.recv(buffer, 0, buffer.length); this.receiverLink.advance();
final Receiver receiver; try { receiver = ((Receiver) delivery.getLink()); if (!delivery.isReadable()) { return; if (receiver.getCredit() < amqpLowMark) { receiver.flow(amqpCredit); if (delivery.available() > DECODE_BUFFER.capacity()) { buffer = ByteBuffer.allocate(delivery.available()); } else { buffer.limit(receiver.recv(buffer.array(), buffer.arrayOffset(), buffer.capacity())); receiver.advance();
private int pumpIn(String address, Receiver receiver) Delivery delivery = receiver.current(); if (delivery.isReadable() && !delivery.isPartial()) int size = delivery.pending(); byte[] buffer = new byte[size]; int read = receiver.recv( buffer, 0, buffer.length ); if (read != size) { throw new IllegalStateException(); receiver.advance(); if (!receiver.getDrain() && _blocked.isEmpty() && _credit > 0) if (receiver.getRemoteCredit() < lo_thresh) final int more = Math.min(_credit, max - receiver.getRemoteCredit()); _credit -= more; _distributed += more; receiver.flow(more); if (receiver.getRemoteCredit() == 0 && _credited.contains(receiver)) if (receiver.getDrain()) receiver.setDrain(false); assert( _draining > 0 ); _draining--;
@Override public void onResponse(AmqpProtocolConverter converter, Response response) throws IOException { if (!delivery.remotelySettled()) { if (response.isException()) { ExceptionResponse error = (ExceptionResponse) response; delivery.disposition(rejected); } else { final DeliveryState remoteState = delivery.getRemoteState(); if (remoteState != null && remoteState instanceof TransactionalState) { TransactionalState txAccepted = new TransactionalState(); if (getEndpoint().getCredit() + --sendsInFlight <= (getConfiguredReceiverCredit() * .3)) { LOG.trace("Sending more credit ({}) to producer: {}", getConfiguredReceiverCredit() * .7, getProducerId()); getEndpoint().flow((int) (getConfiguredReceiverCredit() * .7));
SendRequest sr = engineConnection.inProgressOutboundDeliveries.remove(delivery); Exception exception = null; if (delivery.getRemoteState() instanceof Rejected) { final Rejected rejected = (Rejected) delivery.getRemoteState(); final ErrorCondition error = rejected.getError(); if (error == null || error.getDescription() == null) { exception = new Exception(error.getDescription()); } else if (delivery.getRemoteState() instanceof Released) { exception = new Exception("Message was released"); } else if (delivery.getRemoteState() instanceof Modified) { int amount = delivery.pending(); byte[] data = new byte[amount]; receiver.recv(data, 0, amount); receiver.advance();
Delivery incoming = null; do { incoming = getEndpoint().current(); if (incoming != null) { if (incoming.isReadable() && !incoming.isPartial()) { LOG.trace("{} has incoming Message(s).", this); try { throw IOExceptionSupport.create(e); getEndpoint().advance(); } else { LOG.trace("{} has a partial incoming Message(s), deferring.", this); if (getEndpoint().getRemoteCredit() <= 0) { if (stopRequest != null) { stopRequest.onSuccess();
private boolean processDelivery(Delivery incoming) throws Exception { incoming.setDefaultDeliveryState(Released.getInstance()); message = AmqpCodec.decodeMessage(this, getEndpoint().recv()).asJmsMessage(); } catch (Exception e) { LOG.warn("Error on transform: {}", e.getMessage()); incoming.disposition(MODIFIED_FAILED_UNDELIVERABLE); incoming.settle(); getEndpoint().advance();
@Override public ProtonReceiver createReceiver(String address, ProtonLinkOptions receiverOptions) { Receiver receiver = session.receiver(getOrCreateLinkName(receiverOptions)); Symbol[] outcomes = new Symbol[] { Accepted.DESCRIPTOR_SYMBOL, Rejected.DESCRIPTOR_SYMBOL, Released.DESCRIPTOR_SYMBOL, Modified.DESCRIPTOR_SYMBOL }; Source source = new Source(); source.setAddress(address); source.setOutcomes(outcomes); source.setDefaultOutcome(Released.getInstance()); if(receiverOptions.isDynamic()) { source.setDynamic(true); } Target target = new Target(); receiver.setSource(source); receiver.setTarget(target); ProtonReceiverImpl r = new ProtonReceiverImpl(receiver); r.openHandler((result) -> { LOG.trace("Receiver open completed"); }); r.closeHandler((result) -> { if (result.succeeded()) { LOG.trace("Receiver closed"); } else { LOG.warn("Receiver closed with error", result.cause()); } }); // Default to at-least-once r.setQoS(ProtonQoS.AT_LEAST_ONCE); return r; }
Source source = new Source(); target.setAddress(this.getSenderLinkAddress()); source.setAddress(this.getReceiverLinkAddress()); this.senderLink.setTarget(target); this.senderLink.setSource(source); this.receiverLink.setProperties(this.getAmqpProperties()); Source source = new Source(); target.setAddress(this.getSenderLinkAddress()); source.setAddress(this.getReceiverLinkAddress()); this.receiverLink.setTarget(target); this.receiverLink.setSource(source); this.receiverLink.open();
Receiver receiver; try { receiver = ((Receiver) delivery.getLink()); if (!delivery.isReadable()) { return; if (delivery.isPartial()) { return; readDelivery(receiver, buffer); receiver.advance(); sessionSPI.serverSend(receiver, delivery, address, delivery.getMessageFormat(), buffer);
@Override protected void processDelivery(Delivery delivery) { if( !delivery.isReadable() ) { System.out.println("it was not readable!"); return; } if( current==null ) { current = new ByteArrayOutputStream(); } int count; byte data[] = new byte[1024*4]; while( (count = receiver.recv(data, 0, data.length)) > 0 ) { current.write(data, 0, count); } // Expecting more deliveries.. if( count == 0 ) { return; } receiver.advance(); Buffer buffer = current.toBuffer(); current = null; onMessage(delivery, buffer); }
receiver = ((Receiver) delivery.getLink()); if (!delivery.isReadable()) { return; receiver.advance(); Declared declared = new Declared(); declared.setTxnId(txID); delivery.disposition(declared); delivery.settle();