我在通过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)的消息。
我在做什么错了?
答案 0 :(得分:0)
我上周也面临着同样的问题。
SignalR似乎在处理集线器方面做了一些特殊的工作,并且无法使Masstransit SignalR服务正常工作。
我最终使用了here中所述的静态集线器引用。
基本上,我只是调用Core DI来获取集线器上下文,然后将其存储到静态属性中(如上面列出的Github问题中的示例所示)。
需要时,我从MassTransit消费者中调用引用,然后完成。