【问题标题】:How to read Azure Service Bus messages from Multiple Queues with one worker如何使用一名工作人员从多个队列中读取 Azure 服务总线消息
【发布时间】:2016-11-19 00:51:24
【问题描述】:

我有三个队列和一个工作人员,我想监控三个队列(或仅其中两个)

一个队列是 qPirate 一个队列是 qShips 一个队列是 qPassengers

这个想法是,工作人员要么查看全部 3 个,要么查看其中 2 个,要么查看其中一个,并根据消息内容执行不同的操作。

关键是说消息失败是因为 ship1 离线,qships 中的所有队列都将刷新,正在查看该消息的工作人员和其他队列将稍微挂起,因为他们将尝试处理消息该队列只查看其他队列一点点,而正在查看其他 2 个队列并跳过 qships 的其他工作人员将继续处理消息,而不会出现阻塞或延迟。

    public static void GotMessage([ServiceBusTrigger("%LookAtAllQueuesintheservicebus%")] BrokeredMessage message)
    {
        var handler = new MessageHandler();

        var manager = new MessageManager(
            handler,
            "PirateShips"
            );

        manager.ProcessMessageViaHandler(message);
    }

在网上环顾四周,我猜这不是可能的,但它似乎是可能的?无论哪种方式都提前感谢!

Edit1:我也会添加 Job Host 以尝试澄清一下

        JobHostConfiguration config = new JobHostConfiguration()
        {
            DashboardConnectionString = "DefaultEndpointsProtocol=https;AccountName=PiratesAreUs;AccountKey=Yarr",
            StorageConnectionString = "DefaultEndpointsProtocol=https;AccountName=PiratesAreUs;AccountKey=Yarr",
            NameResolver = new QueueNameResolver()
        };

        ServiceBusConfiguration serviceBusConfig = new ServiceBusConfiguration()
        {
            ConnectionString = "Endpoint=AllPirateQueuesLocatedHere;SharedAccessKeyName=PiratesAreUs;SharedAccessKey=Yarr"               
        };

        serviceBusConfig.MessageOptions.AutoComplete = false;
        serviceBusConfig.MessageOptions.AutoRenewTimeout = TimeSpan.FromMinutes(1);
        serviceBusConfig.MessageOptions.MaxConcurrentCalls = 1;            

        config.UseServiceBus(serviceBusConfig);


        JobHost host = new JobHost(config);

        host.RunAndBlock();

QueueNameResolverClass 也很简单

    public class QueueNameResolver : INameResolver
    {
        public string Resolve(string name)
        {
            return name;
        }
    }

我似乎没有让 NameResolver 成为多个队列,虽然我可以说我希望作业主机查看某个 ServiceBus,但我不知道如何告诉它查看所有队列在服务总线内。

换句话说,我想在这个worker上有多个servicebustriggers,这样如果一条消息被发送到qpirate1和qships1,它们都位于服务总线AllPirateQueuesHere中,worker可以在qpirate1中获取消息,处理它,然后获取qships1 中的消息并进行处理。

【问题讨论】:

  • 这些消息是从 Azure Webjobs 消费的吗?
  • 看签名,是的,约翰。
  • @ivan-s,你能解释一下吗?我真的很难理解你想要达到的目标......谢谢
  • 添加了更多代码和解释。希望能帮助到你。无论哪种方式都提前感谢!

标签: azure message-queue azureservicebus


【解决方案1】:

找到答案...这是可能的,而且比我想象的要简单我不确定为什么我没有把这些点连起来,但我仍然很好奇为什么没有更多关于此的文档。显然,它只是为每个队列创建一个函数,您希望工作人员查看多个队列。因此,如果您有 3 个队列,您可能需要如下所示的内容(您可以以不同方式处理每条消息)。

  public static void GotMessage1([ServiceBusTrigger("%qPirate1%")] BrokeredMessage message)
{
    var handler = new MessageHandler();

    var manager = new MessageManager(
        handler,
        "Pirates"
        );

    manager.ProcessMessageViaHandler(message);
}

  public static void GotMessage2([ServiceBusTrigger("%qShip1%")] BrokeredMessage message)
{
    var handler = new MessageHandler();

    var manager = new MessageManager(
        handler,
        "Ships"
        );

    manager.ProcessMessageViaHandler(message);
}

  public static void GotBooty([ServiceBusTrigger("%qBooty%")] BrokeredMessage message)
{
    var handler = new MessageHandler();

    var manager = new MessageManager(
        handler,
        "Booty"
        );

    manager.ProcessMessageViaHandler(message);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多