I will argue that what they want is a "work queue", not a message queue.<p>I've written about a somewhat similar problem in context of the Mats3 library I've made:
<a href="https://mats3.io/patterns/work-queues/" rel="nofollow">https://mats3.io/patterns/work-queues/</a><p>And yes, the point is then to use a database to hold the work, dispatching from that. In the Mats3 context I describe, the reason is to pace the dispatching to a queue (!), but for them, it should be to just run the work from that table. Also, the introspection/monitoring argument presented should be relevant for them.<p>That a message queue library fetches more messages than the one it is working on is totally normal: ActiveMQ per default uses a prefetch of 1000 for queues, and Short.MAX_VALUE-1 (!) for topics. The broker will backfill you when you've depleted half of that. This is obviously to gain speed, so that once you've finished with one message, you already have another available, not needing to go back to the broker with both network and processing latencies:
<a href="https://activemq.apache.org/what-is-the-prefetch-limit-for" rel="nofollow">https://activemq.apache.org/what-is-the-prefetch-limit-for</a><p>In summary, I feel that the use case they have, "thousands of jobs per day", which is extremely little for a message queue, where many of these jobs are hours-long, is .. well .. not optimal use case for a MQ. It is the wrong tool for the job, and just adds complexity.