Search in sources :

Example 1 with NettyReadable

use of org.apache.activemq.artemis.protocol.amqp.util.NettyReadable in project activemq-artemis by apache.

the class ProtonServerSenderContext method deliverMessage.

/**
 * handle an out going message from ActiveMQ Artemis, send via the Proton Sender
 */
public int deliverMessage(MessageReference messageReference, int deliveryCount, Connection transportConnection) throws Exception {
    if (closed) {
        return 0;
    }
    AMQPMessage message = CoreAmqpConverter.checkAMQP(messageReference.getMessage());
    sessionSPI.invokeOutgoing(message, (ActiveMQProtonRemotingConnection) transportConnection.getProtocolConnection());
    // presettle means we can settle the message on the dealer side before we send it, i.e.
    // for browsers
    boolean preSettle = sender.getRemoteSenderSettleMode() == SenderSettleMode.SETTLED;
    // we only need a tag if we are going to settle later
    byte[] tag = preSettle ? new byte[0] : protonSession.getTag();
    // Let the Message decide how to present the message bytes
    ByteBuf sendBuffer = message.getSendBuffer(deliveryCount);
    try {
        int size = sendBuffer.writerIndex();
        while (!connection.tryLock(1, TimeUnit.SECONDS)) {
            if (closed || sender.getLocalState() == EndpointState.CLOSED) {
                // we return.
                return 0;
            } else {
                if (log.isDebugEnabled()) {
                    log.debug("Couldn't get lock on deliverMessage " + this);
                }
            }
        }
        try {
            final Delivery delivery;
            delivery = sender.delivery(tag, 0, tag.length);
            delivery.setMessageFormat((int) message.getMessageFormat());
            delivery.setContext(messageReference);
            if (sendBuffer.hasArray()) {
                // this will avoid a copy.. patch provided by Norman using buffer.array()
                sender.send(sendBuffer.array(), sendBuffer.arrayOffset() + sendBuffer.readerIndex(), sendBuffer.readableBytes());
            } else {
                sender.send(new NettyReadable(sendBuffer));
            }
            if (preSettle) {
                // Presettled means the client implicitly accepts any delivery we send it.
                sessionSPI.ack(null, brokerConsumer, messageReference.getMessage());
                delivery.settle();
            } else {
                sender.advance();
            }
            connection.flush();
        } finally {
            connection.unlock();
        }
        return size;
    } finally {
        sendBuffer.release();
    }
}
Also used : Delivery(org.apache.qpid.proton.engine.Delivery) ByteBuf(io.netty.buffer.ByteBuf) AMQPMessage(org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage) NettyReadable(org.apache.activemq.artemis.protocol.amqp.util.NettyReadable)

Aggregations

ByteBuf (io.netty.buffer.ByteBuf)1 AMQPMessage (org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage)1 NettyReadable (org.apache.activemq.artemis.protocol.amqp.util.NettyReadable)1 Delivery (org.apache.qpid.proton.engine.Delivery)1