Клиент SignalR не получает сообщение через Masstransit

У меня возникла проблема с отправкой сообщений клиентам через 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.

Что я делаю неправильно?


person Alexander Rezvanov    schedule 29.04.2020    source источник
comment
Вы запустили автобус? Вы должны позвонить IBusControl.StartAsync(), прежде чем что-нибудь случится! Общая ошибка.   -  person nizmow    schedule 29.04.2020
comment
@nizmow да, вы можете видеть, что размещенная служба MassTransit настроена.   -  person Chris Patterson    schedule 29.04.2020
comment
Кроме того, образец является рабочим справочником по SignalR и MassTransit.   -  person Chris Patterson    schedule 29.04.2020
comment
Я настроил masstranzit согласно документации. Вот пример проекта ссылка   -  person Alexander Rezvanov    schedule 30.04.2020
comment
Сценарий использования показан здесь: ссылка   -  person Alexander Rezvanov    schedule 30.04.2020
comment
Я обновил образец, добавив в него образец ConsoleClient. Я протестировал, и он работает, чтобы получать сообщения. Вкратце: вам нужно подключить клиента к одному из концентраторов, который будет либо localhost: 5100, либо localhost: 5200.   -  person maldworth    schedule 01.05.2020
comment
@maldworth, Спасибо за пример консольного приложения. Ваш пример работает. Но у меня другая ситуация. Служба A отправляет событие, служба B перехватывает это событие и должна отправить его на консоль. Но почему-то сообщение не доходит до консоли. Я не понимаю почему. Не могли бы вы взглянуть на мой пример и указать на ошибку. образец   -  person Alexander Rezvanov    schedule 06.05.2020


Ответы (1)


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

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

В итоге я использовал ссылку на статический хаб, как описано здесь.

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

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

person Benjamin Soulier    schedule 10.05.2020
comment
Я делаю то же самое и сейчас. Хотел бы все таки через MassTransit сделать, но вроде не получается. Надеюсь, разработчики MassTransit обратят на это внимание. - person Alexander Rezvanov; 12.05.2020
comment
Не стесняйтесь присоединиться к каналу Masstransit в Discord, Крис в значительной степени помогает всем там masstransit-project.com/discord .html - person Benjamin Soulier; 14.05.2020