Search in sources :

Example 1 with Channel

use of com.rabbitmq.client.impl.AMQImpl.Channel in project rabbitmq-java-client by rabbitmq.

the class ChannelN method processAsync.

/**
 * Protected API - Filters the inbound command stream, processing
 * Basic.Deliver, Basic.Return and Channel.Close specially.  If
 * we're in quiescing mode, all inbound commands are ignored,
 * except for Channel.Close and Channel.CloseOk.
 */
@Override
public boolean processAsync(Command command) throws IOException {
    // If we are isOpen(), then we process commands normally.
    // 
    // If we are not, however, then we are in a quiescing, or
    // shutting-down state as the result of an application
    // decision to close this channel, and we are to discard all
    // incoming commands except for a close and close-ok.
    Method method = command.getMethod();
    // we deal with channel.close in the same way, regardless
    if (method instanceof Channel.Close) {
        asyncShutdown(command);
        return true;
    }
    if (isOpen()) {
        if (method instanceof Basic.Deliver) {
            processDelivery(command, (Basic.Deliver) method);
            return true;
        } else if (method instanceof Basic.Return) {
            callReturnListeners(command, (Basic.Return) method);
            return true;
        } else if (method instanceof Channel.Flow) {
            Channel.Flow channelFlow = (Channel.Flow) method;
            synchronized (_channelMutex) {
                _blockContent = !channelFlow.getActive();
                transmit(new Channel.FlowOk(!_blockContent));
                _channelMutex.notifyAll();
            }
            return true;
        } else if (method instanceof Basic.Ack) {
            Basic.Ack ack = (Basic.Ack) method;
            callConfirmListeners(command, ack);
            handleAckNack(ack.getDeliveryTag(), ack.getMultiple(), false);
            return true;
        } else if (method instanceof Basic.Nack) {
            Basic.Nack nack = (Basic.Nack) method;
            callConfirmListeners(command, nack);
            handleAckNack(nack.getDeliveryTag(), nack.getMultiple(), true);
            return true;
        } else if (method instanceof Basic.RecoverOk) {
            for (Map.Entry<String, Consumer> entry : Utility.copy(_consumers).entrySet()) {
                this.dispatcher.handleRecoverOk(entry.getValue(), entry.getKey());
            }
            // so return false
            return false;
        } else if (method instanceof Basic.Cancel) {
            Basic.Cancel m = (Basic.Cancel) method;
            String consumerTag = m.getConsumerTag();
            Consumer callback = _consumers.remove(consumerTag);
            if (callback == null) {
                callback = defaultConsumer;
            }
            if (callback != null) {
                try {
                    this.dispatcher.handleCancel(callback, consumerTag);
                } catch (WorkPoolFullException e) {
                    // couldn't enqueue in work pool, propagating
                    throw e;
                } catch (Throwable ex) {
                    getConnection().getExceptionHandler().handleConsumerException(this, ex, callback, consumerTag, "handleCancel");
                }
            }
            return true;
        } else {
            return false;
        }
    } else {
        if (method instanceof Channel.CloseOk) {
            // RPC reply one final time by returning false.
            return false;
        } else {
            // true.
            return true;
        }
    }
}
Also used : Basic(com.rabbitmq.client.impl.AMQImpl.Basic) Channel(com.rabbitmq.client.impl.AMQImpl.Channel) Method(com.rabbitmq.client.Method)

Aggregations

Method (com.rabbitmq.client.Method)1 Basic (com.rabbitmq.client.impl.AMQImpl.Basic)1 Channel (com.rabbitmq.client.impl.AMQImpl.Channel)1