Мы пытаемся построить систему очередей заданий поверх ActiveMQ 5.9.1. Мы используем поддержку AMQP 1.0 в activemq, а в настоящее время используем библиотеку qpid jms для клиентского кода.
Для системы очередей заданий жизненно важно, чтобы мы могли установить для предварительной выборки значение 1 - мы хотим, чтобы наши рабочие задания получали только одну задачу за раз, что соответствует шаблону конкурирующих потребителей. Библиотеки qpid поддерживают это, используя определение фабрики соединений, например:
connectionfactory.activemq-amqp-manager = amqp://{user}:{password}@{hostname}:{port}?clientid=job-manager&remote-host=default&max-prefetch=1
Однако ActiveMQ, похоже, полностью игнорирует это, потребитель отображается в консоли администратора activemq как имеющий предварительную выборку 100.
Копнув дальше, я нашел источник: org.apache.activemq.transport.amqp.AmqpProtocolConverter
который включает строку:
consumerInfo.setPrefetchSize(100);
Означает ли это, что поддержка ActiveMQ протокола AMQP 1.0 фиксирует значение предварительной выборки 100 для всех клиентов? Ясно, что это очень неправильно. Какие у нас есть варианты? Мы могли бы переключиться на чистый JMS-клиент, но потеряли бы языковую совместимость. Или мы могли бы переключиться на RabbitMQ, что означает введение другого продукта для поддержки (ActiveMQ уже используется в другом месте).