2

I am adding a MongoDB SignalR (version 2.2.1) backplane to an existing SignalR hub. Without the backplane the OnConnected method on the Hub is called, once the backplane is registered the OnConnected method is not called. With the debugger I can see the Subscribe and Send methods of my backplane's ScaleoutMessageBus being called when the client subscribes, but the OnConnected method is never called.

My OnConnected method:

public override Task OnConnected()
{
        var connectionManager = NestedContainer().GetInstance<IHubConnectionManager>();
        var userName = Context.User.Identity.Name;
        connectionManager.AddConnection<T>(userName, Context.ConnectionId);
        return base.OnConnected();
    }

My ScaleoutMessageBus:

public class MongoMessageBus : ScaleoutMessageBus
{
    private readonly MongoCollection<MongoMessage> _collection;
    private readonly ILog _log;
    private readonly Task _backgroundTask;

    public MongoMessageBus(IDependencyResolver resolver, MongoScaleoutConfiguration configuration)
        : base(resolver, configuration)
    {
        _log = GlobalValues.Container.GetInstance<ILog>();
        var database = GlobalValues.Container.GetInstance<IMongoDatabaseProvider>().GetSwimlaneDatabase();
        CreateCappedCollection(database, configuration);

        _collection = database.GetCollection<MongoMessage>(configuration.CollectionName);

        if (!_collection.IsCapped())
            throw new Exception($"Mongo collection {configuration.CollectionName} must be capped.");

        var cancellationToken = new CancellationToken();
        _backgroundTask = Task.Run(() => ProcessMessages(cancellationToken), cancellationToken);
    }

    protected override Task Send(int streamIndex, IList<Message> messages)
    {
        return Task.Run(() =>
        {
            var message = new MongoMessage(streamIndex, messages);
            _collection.Save(message);
        });
    }

    protected override Task Send(IList<Message> messages)
    {
        return Task.Run(() =>
        {
            var message = new MongoMessage(messages);
            _collection.Save(message);
        });
    }

    protected override void Dispose(bool disposing)
    {
        _backgroundTask.Dispose();

        base.Dispose(disposing);
    }

    private void ProcessMessages(CancellationToken cancellationToken)
    {
        try
        {
            while (true)
            {
                cancellationToken.ThrowIfCancellationRequested();

                var messages = _collection.Find(Query<MongoMessage>.EQ(i => i.Processed, false))
                    .SetFlags(QueryFlags.TailableCursor | QueryFlags.NoCursorTimeout | QueryFlags.AwaitData);

                foreach (var message in messages)
                {
                    var id = (ulong) message.Id.CreationTime.Ticks;
                    var msg = ScaleoutMessage.FromBytes(message.Value);
                    OnReceived(message.StreamIndex, id, msg);

                    var query = Query<MongoMessage>.EQ(i => i.Id, message.Id);
                    var update = Update<MongoMessage>.Set(i => i.Processed, true);
                    _collection.Update(query, update);
                }
            }
        }
        catch (Exception ex)
        {
            _log.Write.Error(ex, $"An error occurred processing the Mongo message bus: {ex.Message}");
        }
    }

    private void CreateCappedCollection(MongoDatabase database, MongoScaleoutConfiguration configuration)
    {
        if (!database.CollectionExists(configuration.CollectionName))
        {
            var collectionOptions = CollectionOptions.SetCapped(true)
            .SetMaxSize(configuration.CollectionMaxSize)
            .SetMaxDocuments(configuration.MaxDocuments);
            database.CreateCollection(configuration.CollectionName, collectionOptions);
        }
    }
}

I am only testing on one server so I am expecting that I should see the OnConnected event called on that server. Is there something I need to handle to make sure OnConnected is called with a backplane?

Brantino
  • 544
  • 1
  • 5
  • 15

0 Answers0