<div dir="ltr">Hi Steve,<div><br></div><div>    This probably happens because both queues are bound to the exchange to receive a message. The reason for that may be an exchange type (fan-out for example will send message to any bound queue) or routing-key. Looking at your example, the routing-key used to bind queues is empty. Hence each message post with empty routing key will be delivered to both queues. You can run simple test to verify that. Just make sure all your queues are set up and then publish a message but do not run any consumers. Login to management portal to check to which queue the message has been routed to.<br><br>You can find more information about routing-key at [http://www.rabbitmq.com/amqp-0-9-1-reference.html#queue.bind.routing-key](http://www.rabbitmq.com/amqp-0-9-1-reference.html#queue.bind.routing-key)</div><div><br></div><div>Cheers,</div><div><br></div><div>Mariusz<br><br><br>On Wednesday, 16 July 2014 21:45:04 UTC+1, Steve Schoon  wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir="ltr"><div><span style="font-size:13px">Here is my strange problem that I can't figure out how to fix:</span><br></div><div><div><ul><li><span style="font-size:13px">consumer 1 write message 'a' to 'work-queue'</span><br></li><li><span style="font-size:13px">worker starts processing job 'a' (this takes a few minutes)</span><br></li><li><span style="font-size:13px">consumer 1 subscribes to 'queue-a' and try to consume 1 msg</span><br></li><li><span style="font-size:13px">consumer 2 subscribes to 'queue-b' and tries to consume 1 msg</span><br></li><li><span style="font-size:13px">worker completes processing job 'a'</span><br></li><li><span style="font-size:13px">worker writes 'a-is-done' message to 'queue-a'</span><br></li><li><span style="font-size:13px">** CONSUMER 2 RECEIVES THE 'a-is-done' WRITTEN TO 'queue-a' EVEN THOUGH IT'S CONSUMING FROM 'queue-b'</span><br></li><li><span style="font-size:13px">consumer 1 receives the expected message from 'queue-a'</span><br></li><li><span style="font-size:13px">worker starts processing job 'b'</span><br></li><li><span style="font-size:13px">worker completes processing job 'b'</span><br></li><li><span style="font-size:13px">worker writes 'b-is-done' message to 'queue-'b</span><br></li></ul></div></div><div>'worker' is a console application that does the following in a forever loop:</div><div><ul><li><span style="font-size:13px">reads 1 message from 'work-queue', </span><br></li><li><span style="font-size:13px">does some processing</span><br></li><li><span style="font-size:13px">write 1 message to 'queue-X' where 'X' is part of the message it read from 'work-queue'</span><br></li></ul></div><div><br></div><div><span style="font-size:13px">'consumer1' and 'consumer2' are requests being handled by a a ServiceStack-based webservice running under IIS 7.5.  The code looks like this:</span><br></div><div><br></div><div>string queueName = request.QueueName;</div><div><div><font face="courier new, monospace">BasicDeliverEventArgs result = null;</font></div><div><font face="courier new, monospace">var connectionFactory = new ConnectionFactory();</font></div><div><font face="courier new, monospace">connectionFactory.Endpoint = new AmqpTcpEndpoint("myhostname");</font></div><div><font face="courier new, monospace">connectionFactory.UserName = "user";</font></div><div><font face="courier new, monospace">connectionFactory.Password = "pass";</font></div><div><font face="courier new, monospace">using (IConnection connection = connectionFactory.<wbr>CreateConnection())</font></div><div><font face="courier new, monospace">{</font></div><div><font face="courier new, monospace"><span style="white-space:pre">       </span>using (IModel channel = connection.CreateModel())</font></div><div><font face="courier new, monospace"><span style="white-space:pre">    </span>{</font></div><div><font face="courier new, monospace"><span style="white-space:pre">            </span>channel.ExchangeDeclare("<wbr>myexchange", ExchangeType.Direct, true);</font></div><div><font face="courier new, monospace"><span style="white-space:pre">               </span>channel.QueueDeclare(<wbr>queueName, false, false, true, null);</font></div><div><font face="courier new, monospace"><span style="white-space:pre">                </span>channel.QueueBind(queueName, "myexchange", "");</font></div><div><span style="font-size:13px;font-family:'courier new',monospace;white-space:pre">           </span><span style="font-size:13px;font-family:'courier new',monospace">using (Subscription sub = new Subscription(channel, "queue-a", false))</span><br></div><div><font face="courier new, monospace"><span style="white-space:pre">          </span>{</font></div><div><span style="font-size:13px;font-family:'courier new',monospace;white-space:pre">                     </span><span style="font-size:13px;font-family:'courier new',monospace">bool rc = sub.Next(60 * 5 * 1000, out result);</span><br></div><div><span style="font-size:13px;font-family:'courier new',monospace;white-space:pre">                     </span><span style="font-size:13px;font-family:'courier new',monospace">if (rc == false && result == null)</span><br></div><div><font face="courier new, monospace"><span style="white-space:pre">                        </span>{</font></div><div><span style="font-size:13px;font-family:'courier new',monospace;white-space:pre">                     </span><span style="font-size:13px;font-family:'courier new',monospace;white-space:pre">  </span><span style="font-family:'courier new',monospace;font-size:13px">throw new Exception("whatever");</span></div><div><span style="font-family:'courier new',monospace;font-size:13px;white-space:pre">                   </span><span style="font-family:'courier new',monospace;font-size:13px">}</span><br></div><div><span style="font-family:'courier new',monospace;font-size:13px;white-space:pre">                  </span><span style="font-family:'courier new',monospace;font-size:13px">sub.Ack(result);</span><br></div><div><font face="courier new, monospace"><span style="white-space:pre">          </span>}</font></div><div><font face="courier new, monospace"><span style="white-space:pre">    </span>}</font></div><div><font face="courier new, monospace">}</font></div><div><span style="font-family:'courier new',monospace;font-size:13px">string msg = Encoding.UTF8.GetString(<wbr>result.Body);</span><br></div></div><div><span style="font-family:'courier new',monospace;font-size:13px"><br></span></div><div><font face="arial, sans-serif">How is is possible that when subscribed to 'queue-a', that a message is received that we placed into 'queue-b'?</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Hope this makes sense....thanks for any thoughts/suggestions.</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">--</font></div><div><font face="arial, sans-serif">Steve Schoon<br></font></div></div></blockquote></div></div>