Клиент SignalR не получает сообщение через Masstransit - PullRequest
0 голосов
/ 29 апреля 2020

У меня была проблема с отправкой сообщений клиентам через MassTransit и SignalR

Запуск:

        //SignalR
        services.AddSignalR().AddMassTransitBackplane();     
        #region MassTransit RabbitMq

        services.AddScoped<SendCosistListToScaleConsumer>();
        services.AddScoped<CreateConsistListConsumer>();

        services.AddMassTransit(x => 
        {
            x.AddSignalRHubConsumers<NotifyHub>();

            x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(conf =>
            {
                conf.Host(Configuration["Rabbit:Host"], host => {
                    host.Username(Configuration["Rabbit:Username"]);
                    host.Password(Configuration["Rabbit:Password"]);
                });                   

               conf.ReceiveEndpoint(Configuration["Rabbit:ReceiveEndpoint"], e => {
                    e.PrefetchCount = 16;
                    e.UseMessageRetry(n => n.Interval(3, 100));

                    #region Consumers
                    e.Consumer<SendCosistListToScaleConsumer>();
                    e.Consumer<CreateConsistListConsumer>();
                   #endregion
               });
                conf.AddSignalRHubEndpoints<NotifyHub>(provider);
            }));
        });
        services.AddMassTransitHostedService();
        #endregion

....

app.UseSignalR(endpoints =>
{
    endpoints.MapHub<NotifyHub>("/notify");
});

Потребитель:

public class CreateConsistListConsumer : IConsumer<ICreateConsistList>
    {
        IReadOnlyList<IHubProtocol> protocols = new IHubProtocol[] { new JsonHubProtocol() };
        public Task Consume(ConsumeContext<ICreateConsistList> context)
        {
            context.Publish<All<NotifyHub>>(
               new
               {
                   Message = protocols.ToProtocolDictionary("SendMessageToAllUsers", new object[] { "CompanyId", context.Message.CompanyId })
               });
            return Task.CompletedTask;
        }
    }

Консольное приложение (клиент SignalR):

   hubConnection.On<Object>("SendMessageToAllUsers", param => {
        Console.WriteLine(param);
     });

Если я правильно понимаю, как работают MassTransii и SignalR, то этого кода достаточно для отправки сообщений клиентам. С помощью отладки я посмотрел, что CreateConsistListConsumer работает, но клиенты не получают отчеты. В то же время клиент подключается к концентратору и правильно получает сообщения из других источников, но не из MassTransit.

Что я делаю не так?

1 Ответ

0 голосов
/ 10 мая 2020

На прошлой неделе я столкнулся с той же проблемой.

Кажется, что SignalR выполняет какую-то особую работу с обработчиками концентраторов и не может заставить работать службу Masstransit SignalR.

Я закончил используя ссылку на концентратор stati c, как описано здесь .

По сути, я просто вызываю Core DI для получения контекста концентратора, а затем сохраняю его в свойстве stati c ( как в примере в выпуске Github, указанном выше).

При необходимости я вызываю ссылку изнутри моего потребителя MassTransit, и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...