// This source code is dual-licensed under the Mozilla Public License ("MPL"), // version 1.1 and the Apache License ("ASL"), version 2.0. // // The ASL v2.0: // // --------------------------------------------------------------------------- // Copyright 2016 Pivotal Software, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // --------------------------------------------------------------------------- // // The MPL v1.1: // // --------------------------------------------------------------------------- // The contents of this file are subject to the Mozilla Public License // Version 1.1 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // https://www.mozilla.org/MPL/ // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations // under the License. // // The Original Code is RabbitMQ // // The Initial Developer of the Original Code is Pivotal Software, Inc. // All Rights Reserved. // // Alternatively, the contents of this file may be used under the terms // of the Apache Standard license (the "ASL License"), in which case the // provisions of the ASL License are applicable instead of those // above. If you wish to allow use of your version of this file only // under the terms of the ASL License and not to allow others to use // your version of this file under the MPL, indicate your decision by // deleting the provisions above and replace them with the notice and // other provisions required by the ASL License. If you do not delete // the provisions above, a recipient may use your version of this file // under either the MPL or the ASL License. // --------------------------------------------------------------------------- #import #import "RMQMethods.h" #import "RMQExchange.h" #import "RMQFrameHandler.h" #import "RMQQueue.h" @protocol RMQConnectionDelegate; /*! * @brief Interface to a channel. * All operations on channels, except methods with 'blocking' in the name, * are asynchronous and execute on a GCD serial queue. * * @see RabbitMQ tutorials */ @protocol RMQChannel @property (nonnull, copy, nonatomic, readonly) NSNumber *channelNumber; /// @brief Closes the channel. - (void)close; /// @brief Closes the channel, blocking the calling thread. - (void)blockingClose; /*! * @brief Turn on publisher confirmations. Sends a confirm.select. * @see afterConfirmed */ - (void)confirmSelect; /*! * @brief Set a callback that will be called when all prior basic.publishes have been acked or nacked. * @discussion Each call to this method delimits a new 'transaction' for a set of basic.publishes. * @param handler The callback to be called with a set of acked and a set of nacked delivery IDs. */ - (void)afterConfirmed:(void (^ _Nonnull)(NSSet * _Nonnull acked, NSSet * _Nonnull nacked))handler; - (void)afterConfirmed:(nonnull NSNumber *)timeout handler:(void (^ _Nonnull)(NSSet * _Nonnull acked, NSSet * _Nonnull nacked))handler; /// @brief Internal. Starts operations and sends the RMQConnectionDelegate to the channel. - (void)activateWithDelegate:(nullable id)delegate; /// @brief Internal. Sends a channel.open. - (void)open; /// @brief Internal. Used by automatic connection recovery. - (void)recover; /// @brief Internal. Block calling thread until channel receives an incoming AMQP method. - (void)blockingWaitOn:(nonnull Class)method; /*! * @brief Declare a queue with options and arguments * @param queueName The name of the queue to be created. An empty string will cause a name to be generated. * @param options Queue declaration options * @param arguments Queue declaration arguments * @return A queue instance */ - (nonnull RMQQueue *)queue:(nonnull NSString *)queueName options:(RMQQueueDeclareOptions)options arguments:(nonnull NSDictionary *> *)arguments; /*! * @brief Declare a queue with options * @param queueName The name of the queue to be created. An empty string will cause a name to be generated. * @param options Queue declaration options * @return A queue instance */ - (nonnull RMQQueue *)queue:(nonnull NSString *)queueName options:(RMQQueueDeclareOptions)options; /*! * @brief Declare a queue with default options * @param queueName The name of the queue to be created. An empty string will cause a name to be generated. * @return A queue instance */ - (nonnull RMQQueue *)queue:(nonnull NSString *)queueName; /// @brief Delete a queue - (void)queueDelete:(nonnull NSString *)queueName options:(RMQQueueDeleteOptions)options; /// @brief Bind a queue to an exchange - (void)queueBind:(nonnull NSString *)queueName exchange:(nonnull NSString *)exchangeName routingKey:(nonnull NSString *)routingKey; /// @brief Unbind a queue from an exchange - (void)queueUnbind:(nonnull NSString *)queueName exchange:(nonnull NSString *)exchangeName routingKey:(nonnull NSString *)routingKey; /*! * @brief Consume messages from a queue * @see RMQQueue's subscribe method (which has variants with defaults) */ - (nonnull RMQConsumer *)basicConsume:(nonnull NSString *)queueName options:(RMQBasicConsumeOptions)options handler:(RMQConsumerDeliveryHandler _Nonnull)handler; /*! * @brief Consume messages from a queue using a pre-built RMQConsumer object * @see RMQQueue's subscribe method (which has variants with defaults) */ - (void)basicConsume:(nonnull RMQConsumer *)consumer; /// @brief Internal method used by a consumer object - (nonnull NSString *)generateConsumerTag; /// @brief Cancel a consumer /// @see RMQConsumer's cancel method - (void)basicCancel:(nonnull NSString *)consumerTag; /*! * @brief Publish a message. * Publishing to a non-existent exchange will result in a channel-level * protocol exception, which closes the channel. * * @return A sequence number that correlates to the numbers sent to the afterConfirmation block (when publisher confirmations are enabled). */ - (nonnull NSNumber *)basicPublish:(nonnull NSData *)body routingKey:(nonnull NSString *)routingKey exchange:(nonnull NSString *)exchange properties:(nonnull NSArray *)properties options:(RMQBasicPublishOptions)options; /*! * @brief Consume messages using basic.get / get-ok * Synchronous: the next message from the server on this channel should be a basic.get-ok */ - (void)basicGet:(nonnull NSString *)queue options:(RMQBasicGetOptions)options completionHandler:(RMQConsumerDeliveryHandler _Nonnull)completionHandler; /*! * @brief Set Quality Of Service options, AKA prefetch. * RabbitMQ has its own interpretation of what these options mean. * @see https://www.rabbitmq.com/consumer-prefetch.html */ - (void)basicQos:(nonnull NSNumber *)count global:(BOOL)isGlobal; /*! * @brief Acknowledge one or several messages. * Supply the deliveryTag from the basicGet handler param or basicConsume handler param. * @param deliveryTag The tag of the message to acknowledge. * @param options When Multiple is set, acknowledges all messages up to and including supplied deliveryTag. */ - (void)ack:(nonnull NSNumber *)deliveryTag options:(RMQBasicAckOptions)options; /*! * @brief Acknowledge one or several messages. * Supply the deliveryTag from the basicGet handler param or basicConsume handler param. * @param deliveryTag The tag of the message to acknowledge. */ - (void)ack:(nonnull NSNumber *)deliveryTag; /*! * @brief Reject one or several received messages. * Supply the deliveryTag from the basicGet handler param or basicConsume handler param. * @param deliveryTag The tag of the message to reject. * @param options When Requeue is set, requeue rather than discard or dead-letter the message(s). * @see nack: */ - (void)reject:(nonnull NSNumber *)deliveryTag options:(RMQBasicRejectOptions)options; /*! * @brief Reject one or several received messages. * Supply the deliveryTag from the basicGet handler param or basicConsume handler param. * @param deliveryTag The tag of the message to reject. * @see nack: */ - (void)reject:(nonnull NSNumber *)deliveryTag; /*! * @brief Reject one or several received messages. * Supply the deliveryTag from the basicGet handler param or basicConsume handler param. * @param deliveryTag The tag of the message to reject. * @param options When Multiple is set, rejects all messages up to and including supplied deliveryTag. * When Requeue is set, requeue rather than discard or dead-letter the message(s). * @see reject: */ - (void)nack:(nonnull NSNumber *)deliveryTag options:(RMQBasicNackOptions)options; /*! * @brief Reject one or several received messages. * Supply the deliveryTag from the basicGet handler param or basicConsume handler param. * @param deliveryTag The tag of the message to reject. * @see reject: */ - (void)nack:(nonnull NSNumber *)deliveryTag; /// @return RMQExchange The default exchange, which allows for convenient ("direct") publishing to queues by name. - (nonnull RMQExchange *)defaultExchange; /*! * @brief Create a fanout exchange. * @return RMQExchange the new fanout exchange. */ - (nonnull RMQExchange *)fanout:(nonnull NSString *)name options:(RMQExchangeDeclareOptions)options; /*! * @brief Create a fanout exchange. * @return RMQExchange the new fanout exchange. */ - (nonnull RMQExchange *)fanout:(nonnull NSString *)name; /*! * @brief Create a direct exchange. * @return RMQExchange the new direct exchange. */ - (nonnull RMQExchange *)direct:(nonnull NSString *)name options:(RMQExchangeDeclareOptions)options; /*! * @brief Create a direct exchange. * @return RMQExchange the new direct exchange. */ - (nonnull RMQExchange *)direct:(nonnull NSString *)name; /*! * @brief Create a topic exchange. * @return RMQExchange the new topic exchange. */ - (nonnull RMQExchange *)topic:(nonnull NSString *)name options:(RMQExchangeDeclareOptions)options; /*! * @brief Create a topic exchange. * @return RMQExchange the new topic exchange. */ - (nonnull RMQExchange *)topic:(nonnull NSString *)name; /*! * @brief Create a headers exchange. * @return RMQExchange the new headers exchange. */ - (nonnull RMQExchange *)headers:(nonnull NSString *)name options:(RMQExchangeDeclareOptions)options; /*! * @brief Create a headers exchange. * @return RMQExchange the new headers exchange. */ - (nonnull RMQExchange *)headers:(nonnull NSString *)name; /*! * @brief Create an exchange of a configurable type. * @param type The exchange type name. * @return RMQExchange The new exchange. */ - (void)exchangeDeclare:(nonnull NSString *)name type:(nonnull NSString *)type options:(RMQExchangeDeclareOptions)options; /*! * @brief Bind an exchange to another exchange. * @param sourceName the name of the exchange from which messages flow across the binding * @param destination: the name of the exchange to which messages flow across the binding * @param routingKey: the routing key to use for the binding */ - (void)exchangeBind:(nonnull NSString *)sourceName destination:(nonnull NSString *)destinationName routingKey:(nonnull NSString *)routingKey; /*! * @brief Unbind an exchange from another exchange. * @param sourceName the name of the exchange from which messages flow across the binding * @param destination: the name of the exchange to which messages flow across the binding * @param routingKey: the routing key of the binding */ - (void)exchangeUnbind:(nonnull NSString *)sourceName destination:(nonnull NSString *)destinationName routingKey:(nonnull NSString *)routingKey; /// @brief Delete an exchange - (void)exchangeDelete:(nonnull NSString *)name options:(RMQExchangeDeleteOptions)options; @end