2016-08-04 61 views
1

這個問題是不是與Scaleout和SignalR Azure的服務總線。我想在我的SignalR網絡套接字應用程序中構建一個Service Bus偵聽器(例如OnMessage),然後將該消息相應地分發給連接的用戶。消息將從各種獨立運行的服務發佈到集中式服務總線中,並且連接到Web套接字服務器的UI /瀏覽器應接收這些消息。Azure的服務總線的集成與SignalR

選項1:我可以將異步任務添加到集線器方法中,以訂閱服務總線並由連接的用戶進行過濾。問題在於它使用了線程池中的一個額外線程,並且將爲執行此操作,每個用戶已啓動套接字連接。我們的應用程序可以輕鬆啓動每個標籤打開5-10個或更多的套接字。

選項2:我可以將一個任務添加到SignalR Startup.Configuration方法,然後接收所有消息並將它們分發給正確的連接用戶。我在這裏遇到的問題是,我無法訪問用於發送到瀏覽器的客戶端對象。

我覺得SignalR和服務總線是一個很好的補充,相互支持近乎實時的通信,但我能找到很少實現這樣的場景。我覺得這應該是一個常見的情況。也許我錯過了一些明顯的設計模式,這將是一個更好的解決方案。

回答

0

我能想出解決辦法。在SignalR Startup.Configuration方法我添加到啓動監聽的方法和在該方法我叫GlobalHost.ConnectionManager.GetHubContext。目前這不會發送給個人用戶,但我會添加某種連接管理器來處理該問題。

public void startServiceBusListener() 
{ 

    // setup subcsription 
    var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString); 
    if (!namespaceManager.SubscriptionExists("myTopic", Environment.MachineName)) 
     namespaceManager.CreateSubscription("myTopic", Environment.MachineName); 

    SubscriptionClient busClient = SubscriptionClient.CreateFromConnectionString(connectionString, "myTopic", Environment.MachineName); 

    // Configure the callback options. 
    OnMessageOptions options = new OnMessageOptions(); 
    options.AutoComplete = false; 
    options.AutoRenewTimeout = TimeSpan.FromMinutes(1); 

    receiveTask = Task.Run(() => 
    { 
     // handle new messages 
     busClient.OnMessage((message) => 
     { 
      try 
      { 
       Notification note = message.GetBody<Notification>(); 
       string notification = JsonConvert.SerializeObject(note); 
       GlobalHost.ConnectionManager.GetHubContext<DispatchHub>().Clients.All.notify(notification); 
       // Remove message from subscription. 
       message.Complete(); 
      } 
      catch (Exception) 
      { 
       // Indicates a problem, unlock message in subscription. 
       message.Abandon(); 
      } 
     }, options); 
    }, cts.Token); 
}