У меня есть приложение в сетевом ядре, которое реализует signalR, это приложение подключено к шине обмена сообщениями, которая реализует Masstrasit Rabbit MQ, приложение собирает сообщения, которые достигают очереди подключенной шины, но необходимо, чтобы эти сообщенияотображаются в клиенте javascript.
Когда сообщения доходят до подписчика очереди, я вызываю метод-концентратор, который отображает сообщения, но этот объект (концентратор) удаляется, что означает, что информация обо всехклиенты, подключенные к концентратору (signalR), потеряны, и нет клиента, которому можно было бы отображать сообщения.
Class Hub SignalR
public class ChatHub : Hub
{
public override async Task OnConnectedAsync(){
String user = Context.GetHttpContext().Request.QueryString.Value.Split("=")[1].Split("&")[0];
string appBus = Context.GetHttpContext().Request.QueryString.Value.Split("=")[2].Split("&")[0];
await Groups.AddToGroupAsync(user, "SignalR Users");
await base.OnConnectedAsync();
ClientesModel client = new ClientModel() {
Username = user,
ID = Context.ConnectionId
};
MessageBusConfig.Configure(appBus, this);
}
public void SendAsync(string user, string message) {
Task.Run(async () =>{
await Clients.All.SendAsync("enviamensaje", user, message);
});
}
}
Class Config Buss
public class MessageBusConfig
{
public static IBusControl BusControl { get; set; }
public static void Configure(String nameQueue, ChatHub hub)
{
BusControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.AutoDelete = true;
var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ReceiveEndpoint(host, nameQueue, e => {
e.Consumer(() => new CheckinCommandProviders(hub));
//e.AutoDelete = true;
});
});
BusControl.Start();
}
}
Класс Consumer mesage buss RabbitMQ с Masstrasit
public class CheckinCommandProviders: IConsumer<ContractSuscriber>{
private ChatHub _hub;
public CheckinCommandProveedores(ChatHub hub){
_hub = hub;
}
public Task Consume(ConsumeContext<ContratoSuscriptor> context){
_hub.SenndAsync(context.Message.Usuario, context.Message.Mensaje);
return Task.FromResult<int>(0);
}
}
Интерфейс Контракт поставщика с подписчиком
Через этот интерфейс потребитель взаимодействует с очередью сообщений
public interface ContratoSuscriptor
{
string Mensaje { get; set; }
string Usuario { get; set; }
bool IsOk { get; set; }
string filtro { get; set; }
}
Главным образом, когда он прибываетКонцентратор объекта был удален, и сообщение не может быть отображено