传入队列消息的永久侦听器

Posted

技术标签:

【中文标题】传入队列消息的永久侦听器【英文标题】:Permanent listener for incoming Queue Messages 【发布时间】:2021-03-16 11:02:56 【问题描述】:

我想做以下事情:

创建一个由函数启动一次的 DLL,然后永久侦听新的传入服务总线消息。

在我看来,我的基本问题是找到一种方法来等待事件处理程序可以执行。我想永久地这样做。所以应该总是可以执行事件处理程序。 目前GetPayloadAsync入口函数终止太快。

在 .NET 中,代码如下所示:

函数GetPayloadAsync

   public static async Task GetPayloadAsyc()
    

        _tokenSource = new CancellationTokenSource();
        var token = _tokenSource.Token;
        await ReceiveMessagesAsync(token));
        
    

ReceiveMessagesAsync 函数如下所示并注册事件处理程序:

static async Task ReceiveMessagesAsync(CancellationToken token)
    
        
        ServiceBusClient client = new ServiceBusClient(AZURE_SERVICE_BUS_CONNECTIONSTRING, new ServiceBusClientOptions
        
            TransportType = ServiceBusTransportType.AmqpWebSockets
        );
        
        ServiceBusSessionProcessor processor = client.CreateSessionProcessor(QUEUE_NAME, new ServiceBusSessionProcessorOptions
        
            MaxConcurrentSessions = 1,
            AutoCompleteMessages = false
        );

        // add handler to process messages
        //processor.
        processor.ProcessMessageAsync += MessageHandler;
        
        // add handler to process any errors
        processor.ProcessErrorAsync += ErrorHandler;
        
        // start processing 
        await processor.StartProcessingAsync(token);                                          

    

有没有人建议我如何解决这个问题?

【问题讨论】:

【参考方案1】:

在我看来,我的基本问题是找到一种方法等到 可以执行事件处理程序。我想永久地这样做。所以 应该总是可以执行事件处理程序。 目前GetPayloadAsync入口函数终止太快。

可以使用azure function的service bus trigger,这是一个现成的工具,可以用来处理新传入的消息到队列。并且它不会终止(这符合您对“永久”的要求)。你可以按照这个来创建一个 azure 函数:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-your-first-function-visual-studio

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=csharp

【讨论】:

首先感谢您的回答。我需要一个通过 DLL 文件的解决方案。此 DLL 文件将集成到我们的 ERP 系统 Dynamics NAV 中。在 Dynamics NAV 中,定义了应该执行的事件处理程序。因此 DLL 接收到一个服务总线消息并触发一个事件。

以上是关于传入队列消息的永久侦听器的主要内容,如果未能解决你的问题,请参考以下文章

JMS 队列上多线程消息处理的最佳实践

Android 应用侦听传入 TCP/IP 消息的最佳方式是啥?

MSMQ 单(队列)对多(侦听器)方案

Spring JMS 监听器中的事务管理

使用线程池的 JMS 侦听器

如何配置和启用 JMS 侦听器以根据某些条件使用消息?