繁体   English   中英

C#Azure服务总线队列OnMessage回调

[英]C# Azure Service Bus Queue OnMessage Callback

我正在编写一些响应Azure Service Bus队列的功能。 当前,这会在指定的队列上进行轮询,并且OnMessage会触发对调用它的原始类中的方法的回调:

    partial class Class1
    {
         private void BeginProcessing()
         {
             serviceBusHelper.Listen(QueueType.Inbound, HandleTransaction);
         }
         private bool HandleTransaction(BrokeredMessage message)
         {
             ...    
         }
    }

然后是服务总线帮助程序类:

public class ServiceBusHelper : IServiceBusHelper
{
    ManualResetEvent CompletedResetEvent = new ManualResetEvent(false);

    public void Listen(QueueType queue, Action<BrokeredMessage> callback)
    {

        switch (queue)
        {
            case QueueType.Inbound:
                inboundClient.OnMessage(message =>
                {
                    try
                    {
                        callback(message);
                    }
                    catch (Exception ex)
                    {
                        ...
                    }
                    CompletedResetEvent.WaitOne();
                });
                break;
            ...
        }
}

它已正确连接到azure服务总线队列并检索该消息,但是该回调似乎从未真正触发过。 我试图实现的服务将持续响应OnMessage事件,尽管实际上是从ServiceBusHelper类触发了OnMessage,但仍会触发新的worker(从class1内部)。

回调似乎从未真正触发过。

为了重现该问题,我在控制台应用程序中进行了测试,并附带了以下代码,效果很好。

public static void processmessage()
{
    string connectionString = "{connectionstring here}";

    var queueName = "{queue name}";

    var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
    var options = new OnMessageOptions();
    options.AutoComplete = false;

    try
    {
        client.OnMessage(message =>
        {
            HandleTransaction(message);
        }, options);
    }
    catch (Exception)
    {

    }
}

private static void HandleTransaction(BrokeredMessage message)
{
    Console.WriteLine(String.Format("Message body: {0}", message.GetBody<String>()));
}

如果可能,您可以尝试修改private bool HandleTransaction(BrokeredMessage message)使其返回void private void HandleTransaction(BrokeredMessage message) ,然后检查其是否正常运行。

因此,我设法通过修改异步OnMessage对应项来使其工作。 我相信根本原因与未将OnMessageOptions指定给OnMessage有关,或者与CompletedResetEvent未按我的预期进行交互有关。

    public void Listen(QueueType queue, Action<BrokeredMessage> callback)
    {
            OnMessageOptions options = new OnMessageOptions
            {   
                MaxConcurrentCalls = maxConcurrent,
                AutoComplete = false
            };

            switch (queue)
            {
                case QueueType.Inbound:
                    inboundClient.OnMessageAsync(async message =>
                    {
                        bool shouldAbandon = false;
                        try
                        {
                            callback(message);

                            // complete if successful processing
                            await message.CompleteAsync();
                        }
                        catch (Exception ex)
                        {
                            shouldAbandon = true;
                            Debug.WriteLine(ex);
                        }

                        if (shouldAbandon)
                        {
                            await m.AbandonAsync();
                        }
                    }, options);
                    break;

                ...
            }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM