<div dir="ltr">Hello everyone,<div><br></div><div style>I have five RabbitMQ consumer clients that are written and deployed as Tomcat web applications.  My original intention was to consume messages in the typical fashion:</div>

<div style><br></div><div style><div><span style="background-color:rgb(204,204,204)">while (true) {</span></div><div><span style="background-color:rgb(204,204,204)"><span class="" style="white-space:pre">        </span>QueueingConsumer.Delivery delivery = consumer.nextDelivery();</span></div>

<div><span style="background-color:rgb(204,204,204)"><span class="" style="white-space:pre">        </span>String message = new String(delivery.getBody());</span></div><div><span style="background-color:rgb(204,204,204)"><span class="" style="white-space:pre">        </span>System.out.println(&quot; [x] Received &#39;&quot; + message + &quot;&#39;&quot;);</span></div>

<div><span style="background-color:rgb(204,204,204)">}</span></div><div><br></div><div style>However, I was unable to stop the Tomcat application by using the while loop (see my post @ <a href="http://stackoverflow.com/questions/14164517/trouble-stopping-a-tomcat-server-that-is-running-a-web-application-with-a-while">http://stackoverflow.com/questions/14164517/trouble-stopping-a-tomcat-server-that-is-running-a-web-application-with-a-while</a>).</div>

<div style><br></div><div style>Instead, I now use a Java ScheduledExecutorService which will call a consumer once every <i>x </i>milliseconds.  </div><div style><br></div><div style><div><span style="background-color:rgb(204,204,204)">scheduler = Executors.newSingleThreadScheduledExecutor();</span></div>

<div><span style="background-color:rgb(204,204,204)">scheduler.scheduleAtFixedRate(new ScheduledConsumer(), 0, 15000, TimeUnit.MILLISECONDS);</span></div></div><div style><br></div><div style>I modified the consumer to only retrieve one individual message, using Channel.basicGet:</div>

<div style><br></div><div style><span style="background-color:rgb(204,204,204)">GetResponse response = channel.basicGet(queueName, autoAck);</span><br></div><div style><br></div><div style>This workaround has been working for me without any problems.  However, I&#39;m starting to wonder if I am going about it all wrong.  You see, I now need to set up a work queue model, so that I can scale my resources and deploy additional consumers as the need arises.  So I could spin up a new Tomcat server and deploy my consumer .war files, and voila.  But it was brought to my attention that by using Channel.basicGet, I am not in fact truly consuming - messages are not being pushed down.  I am instead &quot;pulling&quot; messages.</div>

<div style><br></div><div style>Therefore, I assume that my consumers will not enjoy the luxury of fair, round robin dispatching.  Consumer client &quot;A&quot; might retrieve more messages than consumer client &quot;B&quot;, solely because of the fixed rate at which it was set to consume.</div>

<div style><br></div><div style>My questions are as follows:</div><div style><ol style><li style>Is it a bad idea to deploy consumers as Tomcat web applications?  Are there any advantages or disadvantages as compared to the alternative of running system level Java clients?<br>

<br></li><li style>In the case of work queues, am I better off retrieving messages that are pushed down to my clients, and setting a prefetchCount (channel.basicQos(1)) to ensure that I only receive one message at a time?</li>

</ol><div><br></div><div style>I would appreciate any advice or suggestions.</div><div style><br></div><div style>Thanks!</div></div><div style><br></div><div style><br></div><div style><br></div><div style><span style="color:rgb(51,51,51);font-family:&#39;Courier New&#39;,Courier,monospace;line-height:18px;white-space:nowrap"><br>

</span></div><div style><br></div></div><div style><br></div><div style><br></div></div>