如何从SignalR集线器接收Topic消息
本文关键字:Topic 消息 集线器 SignalR | 更新日期: 2023-09-27 18:05:08
我已经成功创建了一个Azure
应用程序,该应用程序将DbTransactions发送到ServiceBus Queue
,然后将一个'通知消息'排队到ServiceBus Topic
,以便其他客户端监视(…)所以他们可以自动接收更新)。
现在,我想用SignalR
来监视&收到SubscriptionClient
消息…我有测试代码,它自己工作得很好。
我发现了许多发送消息到Azure队列的例子(这很容易)。而且,我有从SubscriptionClient
接收BrokeredMessage
的代码。但是,我不能让SignalR
连续监视我的Distribute
方法。
如何让SignalR
监控Topic
?
CODE BEHIND:(updated)
public void Dequeue()
{
SubscriptionClient subscription = GetTopicSubscriptionClient(TOPIC_NAME, SUBSCRIPTION_NAME);
subscription.Receive();
BrokeredMessage message = subscription.Receive();
if (message != null)
{
try
{
var body = message.GetBody<string>();
var contextXml = message.Properties[PROPERTIES_CONTEXT_XML].ToString();
var transaction = message.Properties[PROPERTIES_TRANSACTION_TYPE].ToString();
Console.WriteLine("Body: " + body);
Console.WriteLine("MessageID: " + message.MessageId);
Console.WriteLine("Custom Property [Transaction]: " + transaction);
var context = XmlSerializer.Deserialize<Person>(contextXml);
message.Complete();
Clients.All.distribute(context, transaction);
}
catch (Exception ex)
{
// Manage later
}
}
}
客户端代码:
// TEST: Hub - GridUpdaterHub
var hubConnection = $.hubConnection();
var gridUpdaterHubProxy = hubConnection.createHubProxy('gridUpdaterHub');
gridUpdaterHubProxy.on('hello', function (message) {
console.log(message);
});
// I want this automated
gridUpdaterHubProxy.on('distribute', function (context, transaction) {
console.log('It is working');
});
connection.start().done(function () {
// This is successful
gridUpdaterHubProxy.invoke('hello', "Hello");
});
我不会那样做的。您的代码正在消耗和保留ASP。. NET线程池的线程用于每个传入连接,所以如果您有许多客户端,您就不能很好地扩展。我不知道SignalR的内部那么深,但我猜你的永无止境的方法是阻止SignalR让客户端调用你的回调,因为这需要服务器方法正确结束。只要尝试改变while(true)
与一些退出后,让我们说,3个消息在队列中,你应该被回调3次,可能这些调用将发生在一起,当你的方法退出。
如果这是正确的,那么你可以移动到一些不同的东西,比如专用一个特定的线程来消费队列,并使用GlobalHost.ConnectionManager.GetHubContext
从那里调用回调。也许更好,你可以尝试一个不同的进程消费队列和做HTTP POST
到你的web应用程序,这反过来广播到客户端。