blob: 120b974c69264c5ce1665f208c429c03c8b04e32 [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;
namespace Apache.Qpid.Proton.Client
{
/// <summary>
/// Reconnection options which will control how a connection deals will connection loss
/// and or inability to connect to the host it was provided at create time.
/// </summary>
public class ReconnectOptions : ICloneable
{
public static readonly bool DEFAULT_RECONNECT_ENABLED = false;
public static readonly int INFINITE = -1;
public static readonly int DEFAULT_WARN_AFTER_RECONNECT_ATTEMPTS = 10;
public static readonly int DEFAULT_RECONNECT_DELAY = 10;
public static readonly int DEFAULT_MAX_RECONNECT_DELAY = 30_000;
public static readonly bool DEFAULT_USE_RECONNECT_BACKOFF = true;
public static readonly double DEFAULT_RECONNECT_BACKOFF_MULTIPLIER = 2.0d;
private readonly List<ReconnectLocation> reconnectLocations = new List<ReconnectLocation>();
/// <summary>
/// Creates a default reconnect options instance.
/// </summary>
public ReconnectOptions() : base()
{
}
/// <summary>
/// Create a new reconnection options instance whose settings are copied from the instance provided.
/// </summary>
/// <param name="other">The reconnect options instance to copy</param>
public ReconnectOptions(ReconnectOptions other) : this()
{
other.CopyInto(this);
}
/// <summary>
/// Clone this options instance, changes to the cloned options are not reflected
/// in this options instance.
/// </summary>
/// <returns>A deep copy of this options instance.</returns>
public virtual object Clone()
{
return CopyInto(new ReconnectOptions());
}
internal ReconnectOptions CopyInto(ReconnectOptions other)
{
other.ReconnectLocations = ReconnectLocations;
other.ReconnectEnabled = ReconnectEnabled;
other.WarnAfterReconnectAttempts = WarnAfterReconnectAttempts;
other.MaxInitialConnectionAttempts = MaxInitialConnectionAttempts;
other.MaxReconnectAttempts = MaxReconnectAttempts;
other.ReconnectDelay = ReconnectDelay;
other.MaxReconnectDelay = MaxReconnectDelay;
other.UseReconnectBackOff = UseReconnectBackOff;
other.ReconnectBackOffMultiplier = ReconnectBackOffMultiplier;
return other;
}
/// <summary>
/// Configure if a connection will attempt reconnection if connection is lost or cannot
/// be established to the primary host provided at create time.
/// </summary>
public bool ReconnectEnabled { get; set; }
/// <summary>
/// Adds the given host and port to the collection of locations where a connection
/// reconnect attempt can be made.
/// </summary>
/// <param name="host">The host where the connection is made</param>
/// <param name="port">The port on the host where the connection is made</param>
/// <returns>This reconnection options instance.</returns>
public ReconnectOptions AddReconnectLocation(string host, int port)
{
this.reconnectLocations.Add(new ReconnectLocation(host, port));
return this;
}
/// <summary>
/// Provides access to get or set the list of reconnection locations that are
/// available from these options. The returned collection is read-only amd the
/// provided collection is copied in this options own collection.
/// </summary>
public IReadOnlyCollection<ReconnectLocation> ReconnectLocations
{
get { return reconnectLocations.AsReadOnly(); }
set
{
this.reconnectLocations.Clear();
this.reconnectLocations.AddRange(value);
}
}
/// <summary>
/// Controls how often the client will log a message indicating that a reconnection is
/// being attempted. The default is to log every 10 connection attempts.
/// </summary>
public int WarnAfterReconnectAttempts { get; set; } = DEFAULT_WARN_AFTER_RECONNECT_ATTEMPTS;
/// <summary>
/// For a client that has never connected to a remote peer before this option controls
/// how many attempts are made to connect before reporting the connection as failed.
/// The default behavior is to use the value of maxReconnectAttempts.
/// </summary>
public int MaxInitialConnectionAttempts { get; set; } = INFINITE;
/// <summary>
/// The number of reconnection attempts allowed before reporting the connection as failed
/// to the client. The default is no limit or (-1).
/// </summary>
public int MaxReconnectAttempts { get; set; } = INFINITE;
/// <summary>
/// Controls the delay between successive reconnection attempts, defaults to 10 milliseconds.
/// If the back off option is not enabled this value remains constant.
/// </summary>
public int ReconnectDelay { get; set; } = DEFAULT_RECONNECT_DELAY;
/// <summary>
/// The maximum time that the client will wait before attempting a reconnect. This value is
/// only used when the back off feature is enabled to ensure that the delay does not grow too
/// large. Defaults to 30 seconds as the max time between successive connection attempts.
/// </summary>
public int MaxReconnectDelay { get; set; } = DEFAULT_MAX_RECONNECT_DELAY;
/// <summary>
/// Controls whether the time between reconnection attempts should grow based on a configured
/// multiplier. This option defaults to true.
/// </summary>
public bool UseReconnectBackOff { get; set; } = DEFAULT_USE_RECONNECT_BACKOFF;
/// <summary>
/// The multiplier used to grow the reconnection delay value, defaults to 2.0d.
/// </summary>
public double ReconnectBackOffMultiplier { get; set; } = DEFAULT_RECONNECT_BACKOFF_MULTIPLIER;
}
}