如何从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");
    });

如何从SignalR集线器接收Topic消息

我不会那样做的。您的代码正在消耗和保留ASP。. NET线程池的线程用于每个传入连接,所以如果您有许多客户端,您就不能很好地扩展。我不知道SignalR的内部那么深,但我猜你的永无止境的方法是阻止SignalR让客户端调用你的回调,因为这需要服务器方法正确结束。只要尝试改变while(true)与一些退出后,让我们说,3个消息在队列中,你应该被回调3次,可能这些调用将发生在一起,当你的方法退出。

如果这是正确的,那么你可以移动到一些不同的东西,比如专用一个特定的线程来消费队列,并使用GlobalHost.ConnectionManager.GetHubContext从那里调用回调。也许更好,你可以尝试一个不同的进程消费队列和做HTTP POST到你的web应用程序,这反过来广播到客户端。