Beispiel #1
0
        private async Task EnsureOrleansClusterConnection()
        {
            if (_clusterClient == null)
            {
                throw new NullReferenceException(nameof(_clusterClient));
            }

            if (_clusterClient.IsInitialized)
            {
                OrleansLog.Connected(_logger);
                return;
            }

            OrleansLog.NotConnected(_logger);
            await _clusterClient.Connect(async ex =>
            {
                if (_retries >= 5)
                {
                    throw ex;
                }

                OrleansLog.ConnectionFailed(_logger, ex);
                await Task.Delay(2000);
                _retries++;
                return(true);
            });

            OrleansLog.ConnectionRestored(_logger);
        }
        private async Task ConnectToClusterAsync()
        {
            await EnsureOrleansClusterConnection();

            OrleansLog.Subscribing(_logger, _id);

            var provider = _clusterClient.GetStreamProvider(Constants.STREAM_PROVIDER);

            _clientMessageStream = provider.GetStream <ClientInvocationMessage>(_id, Constants.CLIENT_MESSAGE_STREAM_NAMESPACE);
            await _clientMessageStream.SubscribeAsync(async (message, token) => await OnReceivedClientMessageAsync(message));

            _allMessageStream = provider.GetStream <AllInvocationMessage>(_hubTypeId, Constants.HUB_MESSAGE_STREAM_NAMESPACE);
            await _allMessageStream.SubscribeAsync(async (message, token) => await OnReceivedAllMessageAsync(message));

            try
            {
                await _clusterClient.GetHubLifetimeManagerGrain(_id, _hubTypeId).OnInitializeAsync(_options.TimeoutInterval ?? TimeSpan.FromSeconds(30));

                // Tick heartbeat
                heartbeatDisposable = Observable.Interval(TimeSpan.FromSeconds(1))
                                      .Subscribe(async value =>
                {
                    await _clusterClient.GetHubLifetimeManagerGrain(_id, _hubTypeId).OnHeartbeatAsync();
                });
            }
            catch (Exception e)
            {
                OrleansLog.InternalMessageFailed(_logger, e);
            }
        }
 private async Task OnReceivedClientMessageAsync(ClientInvocationMessage message)
 {
     OrleansLog.ReceivedFromStream(_logger, _id);
     if (connectionsById.TryGetValue(message.ConnectionId, out var connection))
     {
         var invocationMessage = new InvocationMessage(message.MethodName, message.Args);
         try
         {
             await connection.WriteAsync(invocationMessage).AsTask();
         }
         catch (Exception e)
         {
             OrleansLog.FailedWritingMessage(_logger, e);
         }
     }
 }
Beispiel #4
0
        public void Dispose()
        {
            if (!_initialized)
            {
                return;
            }

            OrleansLog.Unsubscribe(_logger, _id);

            var tasks = connectionsById.Keys.Select(id => _clusterClient.GetStreamProvider(SignalRConstants.STREAM_PROVIDER)
                                                    .GetStream <EventArgs>(InternalSignalRConstants.DISCONNECTION_STREAM_ID, id)
                                                    .OnNextAsync(EventArgs.Empty));

            Task.WaitAll(tasks.ToArray());

            Task.WaitAll(_allMessageHandle.UnsubscribeAsync());
        }
        private async Task OnReceivedAllMessageAsync(AllInvocationMessage message)
        {
            OrleansLog.ReceivedFromStream(_logger, _id);
            var invocationMessage = new InvocationMessage(message.MethodName, message.Args);

            var tasks = connectionsById.Where(pair => !pair.Value.ConnectionAborted.IsCancellationRequested && !message.ExcludedConnectionIds.Contains(pair.Key))
                        .Select(pair => pair.Value.WriteAsync(invocationMessage).AsTask());

            try
            {
                await Task.WhenAll(tasks);
            }
            catch (Exception e)
            {
                OrleansLog.FailedWritingMessage(_logger, e);
            }
        }
Beispiel #6
0
        private async Task InitializeAsync()
        {
            await EnsureOrleansClusterConnection();

            OrleansLog.Subscribing(_logger, _id);

            try
            {
                _clientMessageStream = _clusterClient.GetStreamProvider(SignalRConstants.STREAM_PROVIDER).GetStream <SendClientInvocationMessage>(_id, InternalSignalRConstants.SEND_CLIENT_MESSAGE_STREAM_NAMESPACE);
                _clientMessageHandle = await _clientMessageStream.SubscribeAsync(async (message, token) => await OnReceivedAsync(message));

                _allMessageHandle = await HubProxy.AllMessageStream.SubscribeAsync(async (message, token) => await OnReceivedAsync(message));
            }
            catch (Exception e)
            {
                OrleansLog.InternalMessageFailed(_logger, e);
            }
        }
        private async Task EnsureOrleansClusterConnection()
        {
            if (_clusterClient.IsInitialized)
            {
                OrleansLog.Connected(_logger);
                return;
            }

            OrleansLog.NotConnected(_logger);
            await _clusterClient.Connect(async e =>
            {
                if (_retries >= 8)
                {
                    throw e;
                }

                OrleansLog.ConnectionFailed(_logger, e);
                await Task.Delay(2000);
                _retries++;
                return(true);
            });

            OrleansLog.ConnectionRestored(_logger);
        }
        public void Dispose()
        {
            if (!isInitialized)
            {
                return;
            }

            heartbeatDisposable.Dispose();

            OrleansLog.Unsubscribe(_logger, _id);

            var clientHandles = _clientMessageStream.GetAllSubscriptionHandles().Result;
            var clientTasks   = clientHandles.Select(handle => handle.UnsubscribeAsync()).ToArray();

            Task.WaitAll(clientTasks);

            //var allHandles = _allMessageStream.GetAllSubscriptionHandles().Result;
            //var allTasks = clientHandles.Select(handle => handle.UnsubscribeAsync()).ToArray();
            //Task.WaitAll(allTasks);

            var task = _clusterClient.GetHubLifetimeManagerGrain(_id, _hubTypeId).AbortAsync();

            Task.WaitAll(task);
        }