我已成功创建了一个Azure
应用程序,可将DbTransactions发送到ServiceBus Queue
,然后将“{0}”通知消息排入队列。到ServiceBus Topic
以便其他客户监控(......这样他们就可以自动接收更新)。
现在,我想使用SignalR
来监控&收到SubscriptionClient
消息...我的测试代码在其'上运行正常。自己的。
我找到了许多将消息发送到Azure队列的示例(这很简单)。而且,我有代码从BrokeredMessage
收到SubscriptionClient
。但是,我无法让SignalR
继续监控我的Distribute
方法。
如何让SignalR
监控Topic
?
背后的代码:(已更新)
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");
});
答案 0 :(得分:0)
我不会那样做。您的代码正在消耗并保留每个传入连接的ASP.NET线程池的线程,因此如果您有许多客户端,则根本无法正常扩展。我不太了解SignalR的内部结构,但我猜你的永无止境的方法是阻止SignalR让客户端调用你的回调,因为这需要服务器方法正确结束。只是尝试更改while(true)
以及之后退出的内容,比如队列中的3条消息,你应该回叫3次,当你的方法退出时,这些调用可能会一起发生。
如果这是正确的,那么你可以转向不同的东西,比如将一个特定的线程专用于使用队列并从那里调用回调来GlobalHost.ConnectionManager.GetHubContext
。可能更好,您可以尝试使用不同的进程来使用队列并对您的Web应用程序执行HTTP POST
,然后将其广播到客户端。