Azure WebJobs: триггеры очереди с разными размерами пакетов - PullRequest
0 голосов
/ 03 октября 2018

У меня есть WebJob на Azure, который обрабатывает сообщения из нескольких очередей одновременно:

public async static Task ProcessQueueMessage1([QueueTrigger("queue1")] string message)
    {


        switch (message.Substring(message.Length - 3, 3))
        {
            case "tze":
                await Parser.Process1(message);
                break;
            default:
                break;
        }
    }


    public async static Task ProcessQueueMessage2([QueueTrigger("queue2")] string message)
    {


        switch (message.Substring(message.Length - 3, 3))
        {
            case "tzr":
                await Parser.Process2(message);
                break;
            default:
                break;
        }
    }

А в MAIN

static void Main()
    {

        JobHostConfiguration config = new JobHostConfiguration();
        config.Queues.BatchSize = 3;
        config.Queues.MaxDequeueCount = 1;
        var host = new JobHost(config);
        host.RunAndBlock();

    }

здесь: message.Substring(message.Length - 3, 3) просто проверяетрасширение файла.

Мой вопрос: как мне сделать так, чтобы размер пакета queue1 отличался от queue2, могу ли я создать второй jobhost с другой конфигурацией и иметь host.RunAndBlock() и host2.RunAndBlock()??Как мне указать, какую очередь должен выполнять jobhost?

Я также пробовал Groupqueuetriggers, но, к сожалению, они принимают строку, и в моей ситуации я не могу фактически передать списки в очередь.(

1 Ответ

0 голосов
/ 04 октября 2018

Для решения этой проблемы вам необходимо предоставить собственную реализацию IQueueProcessorFactory.Вам нужен только один JobHost.

Здесь приведен пример того, как это сделать .

    static void Main()
    {

        //Configure JobHost
        var config = new JobHostConfiguration();
        config.Queues.BatchSize = 32;
        config.Queues.MaxDequeueCount = 6;
        // Create a custom configuration
        // If you're using DI you should get this from the kernel
        config.Queues.QueueProcessorFactory = new CustomQueueProcessorFactory();

        //Pass configuration to JobJost
        var host = new JobHost(config);
        // The following code ensures that the WebJob will be running continuously
        host.RunAndBlock();
    }

И в CustomQueueProcessorFactory вы можете вставить пользовательскую конфигурацию на основеимя очереди

public class CustomQueueProcessorFactory : IQueueProcessorFactory
{
    public QueueProcessor Create(QueueProcessorFactoryContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }
        if (context.Queue.Name == "queuename1")
        {
            context.MaxDequeueCount = 10;
        }
        else if (context.Queue.Name == "queuename2")
        {
            context.MaxDequeueCount = 10;
            context.BatchSize = 1;
        }

        return new QueueProcessor(context);
    }
}
...