Skip to content

Instantly share code, notes, and snippets.

@zpqrtbnk
Created October 19, 2021 17:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zpqrtbnk/46d629056e03d1fb8f5a2ec408a99aa7 to your computer and use it in GitHub Desktop.
Save zpqrtbnk/46d629056e03d1fb8f5a2ec408a99aa7 to your computer and use it in GitHub Desktop.
HazelcastClientSingleton
// 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.
using System;
using System.Threading.Tasks;
using Hazelcast;
using Microsoft.Extensions.Options;
namespace WebApi31
{
public class HazelcastClientSingleton : IDisposable
{
private readonly IOptions<HazelcastOptions> _options;
private readonly object _mutex = new object();
private ValueTask<IHazelcastClient> _starting;
private bool _started;
private IHazelcastClient _client;
public HazelcastClientSingleton(IOptions<HazelcastOptions> options)
{
_options = options;
}
public ValueTask<IHazelcastClient> GetOrStartNewClientAsync()
{
lock (_mutex)
{
if (_client != null) return new ValueTask<IHazelcastClient>(_client);
if (_started) return _starting;
_starting = StartClientNewAsync();
_started = true;
return _starting;
}
}
private async ValueTask<IHazelcastClient> StartClientNewAsync()
{
return _client = await HazelcastClientFactory.StartNewClientAsync(_options.Value);
}
public void Dispose()
{
// unfortunately the container which disposes the singleton does not do async
_client?.DisposeAsync().GetAwaiter().GetResult();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment