blob: ffc6fe5443e3957aa2e17126377c87fd0bf0cebb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Apache.Qpid.Proton.Client
{
/// <summary>
/// A single AMQP session instance.
/// </summary>
public interface ISession : IDisposable
{
/// <summary>
/// Returns the parent client instance that hosts this session.
/// </summary>
IClient Client { get; }
/// <summary>
/// Returns the parent connection instance that created this session.
/// </summary>
IConnection Connection { get; }
/// <summary>
/// When a session is created and returned to the client application it may not
/// be remotely opened yet and if the client needs to wait for completion of the
/// open before proceeding the open task can be fetched and waited upon.
/// </summary>
Task<ISession> OpenTask { get; }
/// <summary>
/// Initiates a close of the session and awaits a response from the remote that
/// indicates completion of the close operation. If the response from the remote
/// exceeds the configure close timeout the method returns after cleaning up the
/// session resources.
/// </summary>
/// <param name="error">Optional error condition to convey to the remote</param>
void Close(IErrorCondition error = null);
/// <summary>
/// Initiates a close of the session and a Task that allows the caller to await
/// or poll for the response from the remote that indicates completion of the close
/// operation. If the response from the remote exceeds the configure close timeout
/// the session will be cleaned up and the Task signalled indicating completion.
/// </summary>
/// <param name="error">Optional error condition to convey to the remote</param>
Task<ISession> CloseAsync(IErrorCondition error = null);
/// <summary>
/// Creates a receiver used to consume messages from the given node address. The
/// returned receiver will be configured using the provided receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="address">The address of the node the receiver attaches to</param>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <returns>A new receiver instance</returns>
IReceiver OpenReceiver(string address, ReceiverOptions options = null);
/// <summary>
/// Creates a receiver used to consume messages from the given node address. The
/// returned Task will allow the caller to wait for the creation of the receiver
/// configured using the provided receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="address">The address of the node the receiver attaches to</param>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <returns>A new Task<Receiver> instance that can be awaited</returns>
Task<IReceiver> OpenReceiverAsync(string address, ReceiverOptions options = null);
/// <summary>
/// Creates a receiver used to consume messages from the given node address. The
/// returned receiver will be configured using the provided receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="address">The address of the node the receiver attaches to</param>
/// <param name="subscriptionName">The subscription name to use for the receiver</param>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <returns>A new receiver instance</returns>
IReceiver OpenDurableReceiver(string address, string subscriptionName, ReceiverOptions options = null);
/// <summary>
/// Creates a receiver used to consume messages from the given node address. The
/// returned Task will allow the caller to wait for the creation of the receiver
/// configured using the provided receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="address">The address of the node the receiver attaches to</param>
/// <param name="subscriptionName">The subscription name to use for the receiver</param>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <returns>A new Task<Receiver> instance that can be awaited</returns>
Task<IReceiver> OpenDurableReceiverAsync(string address, string subscriptionName, ReceiverOptions options = null);
/// <summary>
/// Creates a dynamic receiver used to consume messages from the dynamically generated node.
/// on the remote. The returned receiver will be configured using the provided options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <param name="dynamicNodeProperties">Optional properties to assign to the node create</param>
/// <returns>A new receiver instance</returns>
IReceiver OpenDynamicReceiver(ReceiverOptions options = null, IDictionary<string, object> dynamicNodeProperties = null);
/// <summary>
/// Creates a dynamic receiver used to consume messages from the dynamically generated node.
/// on the remote. The returned Task will allow the caller to wait for the creation of the
/// receiver configured using the provided receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <param name="dynamicNodeProperties">Optional properties to assign to the node create</param>
/// <returns>A new Task<Receiver> instance that can be awaited</returns>
Task<IReceiver> OpenDynamicReceiverAsync(ReceiverOptions options = null, IDictionary<string, object> dynamicNodeProperties = null);
/// <summary>
/// Creates a sender used to send messages to the given node address. The returned sender
/// will be configured using configuration options provided.
///
/// The returned sender may not have been opened on the remote when it is returned. Some
/// methods of the sender can block until the remote fully opens the sender, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// sender and using it to await the completion of the sender open.
/// </summary>
/// <param name="address">The address of the node the sender attaches to</param>
/// <param name="options">Optional sender options to use for configuration</param>
/// <returns>A new sender instance.</returns>
ISender OpenSender(string address, SenderOptions options = null);
/// <summary>
/// Creates a sender used to send messages to the given node address. The returned Task
/// will allow the caller to wait for the creation of the receiver configured using the
/// provided receiver options.
///
/// The returned sender may not have been opened on the remote when it is returned. Some
/// methods of the sender can block until the remote fully opens the sender, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// sender and using it to await the completion of the sender open.
/// </summary>
/// <param name="address">The address of the node the sender attaches to</param>
/// <param name="options">Optional sender options to use for configuration</param>
/// <returns>A new Task<ISender> instance.</returns>
Task<ISender> OpenSenderAsync(string address, SenderOptions options = null);
/// <summary>
/// Creates a anonymous sender used to send messages to the "anonymous relay" on the
/// remote. Each message sent must include a "to" address for the remote to route the
/// message. The returned sender will be configured using the provided sender options.
///
/// The returned sender may not have been opened on the remote when it is returned. Some
/// methods of the sender can block until the remote fully opens the sender, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// sender and using it to await the completion of the sender open.
/// </summary>
/// <param name="options">Optional sender options to use for configuration</param>
/// <returns>A new sender instance.</returns>
ISender OpenAnonymousSender(SenderOptions options = null);
/// <summary>
/// Creates a anonymous sender used to send messages to the "anonymous relay" on the
/// remote. Each message sent must include a "to" address for the remote to route the
/// message. The returned Task will allow the caller to wait for the creation of the
/// receiver configured using the provided receiver options.
///
/// The returned sender may not have been opened on the remote when it is returned. Some
/// methods of the sender can block until the remote fully opens the sender, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// sender and using it to await the completion of the sender open.
/// </summary>
/// <param name="options">Optional sender options to use for configuration</param>
/// <returns>A new Task<ISender> instance.</returns>
Task<ISender> OpenAnonymousSenderAsync(SenderOptions options = null);
/// <summary>
/// Returns the properties that the remote provided upon successfully opening the session.
/// If the open has not completed yet this method will block to await the open response which
/// carries the remote properties. If the remote provides no properties this method will
/// return null.
/// </summary>
IReadOnlyDictionary<string, object> Properties { get; }
/// <summary>
/// Returns the offered capabilities that the remote provided upon successfully opening the
/// session. If the open has not completed yet this method will block to await the open
/// response which carries the remote offered capabilities. If the remote provides no offered
/// capabilities this method will return null.
/// </summary>
IReadOnlyCollection<string> OfferedCapabilities { get; }
/// <summary>
/// Returns the desired capabilities that the remote provided upon successfully opening the
/// session. If the open has not completed yet this method will block to await the open
/// response which carries the remote desired capabilities. If the remote provides no desired
/// capabilities this method will return null.
/// </summary>
IReadOnlyCollection<string> DesiredCapabilities { get; }
/// <summary>
/// Opens a new transaction scoped to this {@link Session} if one is not already active.
/// <para>
/// A Session that has an active transaction will perform all sends and all delivery
/// dispositions under that active transaction. If the user wishes to send with the same
/// session but outside of a transaction they user must commit the active transaction and
/// not request that a new one be started. A session can only have one active transaction
/// at a time and as such any call to begin while there is a currently active transaction
/// will throw an ClientTransactionNotActiveException to indicate that the operation being
/// requested is not valid at that time.
/// </para>
/// </summary>
/// <remarks>
/// This is a blocking method that will return successfully only after a new transaction
/// has been started.
/// </remarks>
/// <returns>This Session instance</returns>
ISession BeginTransaction();
/// <summary>
/// Opens a new transaction scoped to this {@link Session} if one is not already active.
/// The transaction will not be considered active until the returned Task is completed.
/// <para>
/// A Session that has an active transaction will perform all sends and all delivery
/// dispositions under that active transaction. If the user wishes to send with the same
/// session but outside of a transaction they user must commit the active transaction and
/// not request that a new one be started. A session can only have one active transaction
/// at a time and as such any call to begin while there is a currently active transaction
/// will throw an ClientTransactionNotActiveException to indicate that the operation being
/// requested is not valid at that time.
/// </para>
/// </summary>
/// <returns>A Task whose result is the Session instance now under a transaction</returns>
Task<ISession> BeginTransactionAsync();
/// <summary>
/// Commit the currently active transaction in this Session.
/// <para>
/// Commit the currently active transaction in this Session but does not start a new
/// transaction automatically. If there is no current transaction this method will throw
/// an ClientTransactionNotActiveException to indicate this error. If the active transaction
/// has entered an in doubt state or was remotely rolled back this method will throw an error
/// to indicate that the commit failed and that a new transaction need to be started by the
/// user. When a transaction rolled back error occurs the user should assume that all work
/// performed under that transaction has failed and will need to be attempted under a new
/// transaction.
/// </para>
/// </summary>
/// <remarks>
/// This is a blocking method that will return successfully only after the transaction
/// has been committed.
/// </remarks>
/// <returns>This Session instance</returns>
ISession CommitTransaction();
/// <summary>
/// Asynchronously commit the currently active transaction in this Session, the transaction
/// cannot be considered retired until the Task has been completed.
/// <para>
/// Commit the currently active transaction in this Session but does not start a new
/// transaction automatically. If there is no current transaction this method fails the returned
/// Task with an ClientTransactionNotActiveException to indicate this error. If the active
/// transaction has entered an in doubt state or was remotely rolled back this method fail the
/// Task with an error to indicate that the commit failed and that a new transaction need to be
/// started by the user. When a transaction rolled back error occurs the user should assume that
/// all work performed under that transaction has failed and will need to be attempted under a
/// new transaction.
/// </para>
/// </summary>
/// <returns>A Task whose result is the Session no longer under a transaction</returns>
Task<ISession> CommitTransactionAsync();
/// <summary>
/// Roll back the currently active transaction in this Session.
/// <para>
/// Roll back the currently active transaction in this Session but does not automatically
/// start a new transaction. If there is no current transaction this method will throw an
/// ClientTransactionNotActiveException to indicate this error. If the active transaction
/// has entered an in doubt state or was remotely rolled back this method will throw an
/// error to indicate that the roll back failed and that a new transaction need to be
/// started by the user.
/// </para>
/// </summary>
/// <remarks>
/// This is a blocking method that will return successfully only after the transaction
/// has been rolled back.
/// </remarks>
/// <returns>This Session instance</returns>
ISession RollbackTransaction();
/// <summary>
/// Asynchronously roll back the currently active transaction in this Session.
/// <para>
/// Roll back the currently active transaction in this Session but does not automatically
/// start a new transaction. If there is no current transaction this method fails the returned
/// Task an ClientTransactionNotActiveException to indicate this error. If the active transaction
/// has entered an in doubt state or was remotely rolled back this method will fail the returned
/// Task with an error to indicate that the roll back failed and that a new transaction need to
/// be started by the user.
/// </para>
/// </summary>
/// <returns>A Task whose result is the Session no longer under a transaction</returns>
Task<ISession> RollbackTransactionAsync();
/// <summary>
/// Waits indefinitely for a receiver created from this session to have a delivery ready for
/// receipt. The selection of the next receiver when more than one exists which has pending
/// deliveries is based upon the configured value of the default next receiver policy that
/// was configured in the session options used to create this session, or the connection
/// level policy if none was assigned to the session options.
/// </summary>
/// <returns>The next receiver that has a pending delivery available based on policy.</returns>
IReceiver NextReceiver();
/// <summary>
/// Returns a task that will complete only after a receiver created from this session has
/// a delivery ready for receipt. The selection of the next receiver when more than one
/// exists which has pending deliveries is based upon the configured value of the default next
/// receiver policy that was configured in the session options used to create this session,
/// or the connection level policy if none was assigned to the session options.
/// </summary>
/// <returns>A Task that results in the next receiver that has a pending delivery available based on policy.</returns>
Task<IReceiver> NextReceiverAsync();
/// <summary>
/// Waits indefinitely for a receiver created from this session to have a delivery ready for
/// receipt. The selection of the next receiver when more than one exists which has pending
/// deliveries is based upon the value of the next receiver policy that is provided by the caller.
/// </summary>
/// <param name="policy">The next receiver policy to apply when selecting a result</param>
/// <returns></returns>
IReceiver NextReceiver(NextReceiverPolicy policy);
/// <summary>
/// Returns a task that will complete only after a receiver created from this session has
/// a delivery ready for receipt. The selection of the next receiver when more than one
/// exists which has pending deliveries is based upon the value of the next receiver policy
/// that is provided by the caller.
/// </summary>
/// <param name="policy">The next receiver policy to apply when selecting a result</param>
/// <returns>A Task that results in the next receiver that has a pending delivery available based on policy.</returns>
Task<IReceiver> NextReceiverAsync(NextReceiverPolicy policy);
/// <summary>
/// Waits up to the given timeout for a receiver created from this session to have a delivery ready
/// for receipt. The selection of the next receiver when more than one exists which has pending
/// deliveries is based upon the configured value of the default next receiver policy that was
/// configured in the session options used to create this session, or the connection level policy
/// if none was assigned to the session options.
/// </summary>
/// <param name="timeout">The time to wait for a receiver to have a pending delivery</param>
/// <returns></returns>
IReceiver NextReceiver(TimeSpan timeout);
/// <summary>
/// Returns a task that will complete once a receiver created from this session has a delivery
/// ready for receipt or the given timeout expires. The selection of the next receiver when more
/// than one exists which has pending deliveries is based upon the configured value of the default
/// next receiver policy that was configured in the session options used to create this session,
/// or the connection level policy if none was assigned to the session options.
/// </summary>
/// <param name="timeout">The time to wait for a receiver to have a pending delivery</param>
/// <returns></returns>
Task<IReceiver> NextReceiverAsync(TimeSpan timeout);
/// <summary>
/// Waits up to the given timeout for a receiver created from this session to have a delivery ready
/// for receipt. The selection of the next receiver when more than one exists which has pending
/// deliveries is based upon the value of the next receiver policy that is provided by the caller.
/// </summary>
/// <param name="policy">The next receiver policy to apply when selecting a result</param>
/// <param name="timeout">The time to wait for a receiver to have a pending delivery</param>
/// <returns>A Task that results in the next receiver that has a pending delivery available based on policy.</returns>
IReceiver NextReceiver(NextReceiverPolicy policy, TimeSpan timeout);
/// <summary>
/// Returns a task that will complete once a receiver created from this session has a delivery
/// ready for receipt or the given timeout expires. The selection of the next receiver when more
/// than one exists which has pending deliveries is based upon the value of the next receiver policy
/// that is provided by the caller.
/// </summary>
/// <param name="policy">The next receiver policy to apply when selecting a result</param>
/// <param name="timeout">The time to wait for a receiver to have a pending delivery</param>
/// <returns>A Task that results in the next receiver that has a pending delivery available based on policy.</returns>
Task<IReceiver> NextReceiverAsync(NextReceiverPolicy policy, TimeSpan timeout);
}
}