Skip to content

Commit

Permalink
Fix client connection approach
Browse files Browse the repository at this point in the history
  • Loading branch information
yevhen committed Aug 1, 2017
1 parent f146302 commit 6c20b0f
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 21 deletions.
2 changes: 1 addition & 1 deletion Source/Example.Observers.Chat.Client/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ private static async Task RunChatClient(ClientActorSystem system)
const string room = "Orleankka";

Console.WriteLine("Connecting to server ...");
await system.Connect(retries: 2);
await system.Connect(retries: 5);

Console.WriteLine("Enter your user name...");
var userName = Console.ReadLine();
Expand Down
51 changes: 31 additions & 20 deletions Source/Orleankka/Client/ClientActorSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,23 +30,14 @@ public interface IClientActorSystem : IActorSystem
/// </summary>
public sealed class ClientActorSystem : ActorSystem, IClientActorSystem, IDisposable
{
internal ClientActorSystem(ClientConfiguration configuration, Action<IServiceCollection> configure, IActorRefInvoker invoker)
readonly ClientConfiguration configuration;
readonly Action<IServiceCollection> configureServices;

internal ClientActorSystem(ClientConfiguration configuration, Action<IServiceCollection> configureServices, IActorRefInvoker invoker)
: base(invoker)
{
using (Trace.Execution("Orleans client initialization"))
Client = new ClientBuilder()
.UseConfiguration(configuration)
.ConfigureServices(services =>
{
services.Add(ServiceDescriptor.Singleton<IActorSystem>(this));
services.Add(ServiceDescriptor.Singleton<IClientActorSystem>(this));
services.Add(ServiceDescriptor.Singleton(this));

configure?.Invoke(services);
})
.Build();

Initialize(Client.ServiceProvider);
this.configuration = configuration;
this.configureServices = configureServices;
}

/// <inheritdoc />
Expand All @@ -59,12 +50,12 @@ public async Task<IClientObservable> CreateObservable()
/// <summary>
/// Returns underlying <see cref="IClusterClient"/> instance
/// </summary>
public IClusterClient Client { get; }
public IClusterClient Client { get; private set; }

/// <summary>
/// Checks whether this client has been successfully connected (ie initialized)
/// </summary>
public bool Connected => Client.IsInitialized;
public bool Connected => Client?.IsInitialized ?? false;

/// <summary>
/// Connects this instance of client actor system to cluster
Expand All @@ -85,15 +76,19 @@ public async Task Connect(int retries = 0, TimeSpan? retryTimeout = null)
{
try
{
Client = Build();

using (Trace.Execution("Orleans client connection"))
await Client.Connect();
await Client.Connect().ConfigureAwait(false);

Initialize(Client.ServiceProvider);
}
catch (Exception ex)
{
if (retries >= 0)
{
System.Diagnostics.Trace.TraceWarning($"Can't connect to cluster. Trying again in {(int)retryTimeout.Value.TotalSeconds} seconds ... Got error: /n{ex}");
Thread.Sleep(retryTimeout.Value);
await Task.Delay(retryTimeout.Value).ConfigureAwait(false);
}
else
{
Expand All @@ -104,6 +99,22 @@ public async Task Connect(int retries = 0, TimeSpan? retryTimeout = null)
}
}

IClusterClient Build()
{
using (Trace.Execution("Orleans client initialization"))
return new ClientBuilder()
.UseConfiguration(configuration)
.ConfigureServices(services =>
{
services.Add(ServiceDescriptor.Singleton<IActorSystem>(this));
services.Add(ServiceDescriptor.Singleton<IClientActorSystem>(this));
services.Add(ServiceDescriptor.Singleton(this));

configureServices?.Invoke(services);
})
.Build();
}

/// <summary>
/// Disconnects this instance of client actor system from cluster
/// </summary>
Expand All @@ -119,7 +130,7 @@ public async Task Disconnect(bool force = false)
return;
}

await Client.Close();
await Client.Close().ConfigureAwait(false);
}

/// <inheritdoc />
Expand Down

0 comments on commit 6c20b0f

Please sign in to comment.