【问题标题】:SignalR client does not receive message through MasstransitSignalR 客户端未通过 Masstransit 接收消息
【发布时间】:2020-08-13 01:51:27
【问题描述】:

我在通过 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。

我做错了什么?

【问题讨论】:

  • 你启动巴士了吗?在发生任何事情之前,您必须致电IBusControl.StartAsync()!常见错误。
  • @nizmow 是的,您可以看到 MassTransit Hosted Service 已配置。
  • 另外,sample 是 SignalR 和 MassTransit 的工作参考。
  • 我根据文档配置了masstranzit。这里是一个示例项目link
  • 使用场景如下:link

标签: signalr masstransit signalr-backplane


【解决方案1】:

上周我也遇到了同样的问题。

看来 SignalR 正在处理集线器方面做一些特殊的工作,但无法使 Masstransit SignalR 服务正常工作。

我最终使用了here 所述的静态集线器引用。

基本上,我只是调用 Core DI 来获取我的中心上下文,然后将其存储到静态属性中(如上面列出的 Github 问题中的示例)。

当需要时,我从我的 MassTransit Consumer 中调用引用,然后我就完成了。

【讨论】:

  • 我现在也在做同样的事情。我想通过 MassTransit 做同样的事情,但它似乎不起作用。希望MassTransit的开发者注意这一点。
  • 欢迎加入 Masstransit Discord 频道,Chris 非常愿意帮助那里的每个人masstransit-project.com/discord.html
猜你喜欢
  • 2013-05-21
  • 2016-08-25
  • 2020-10-15
  • 1970-01-01
  • 2016-04-29
  • 2017-05-26
  • 1970-01-01
  • 2019-09-27
  • 2020-07-10
相关资源
最近更新 更多