<div dir="ltr"><div>Hello list,</div><div><br></div>It appears that flow control can cause the Java API to block indefinitely on the call to Channel.waitForConfirmsOrDie(long timeout), regardless of the timeout value.<div>

<div><br></div><div>Is this intentional?<br></div></div><div><br></div><div>I tested this with RabbitMQ 3.2.0 and the official Java client 3.2.0.</div><div><br></div><div>Steps to reproduce:</div><div><ol><li>Start a RabbitMQ broker<br>


</li><li>Connect with the Java client<br></li><li>Create a Channel and call `confirmSelect`</li><li>Run `rabbitmqctl set_vm_memory_high_watermark 0.0`<br></li><li>Call `basicPublish` to publish a message</li><li>Call `Channel.waitForConfirmsOrDie(1000L)`</li>


<li>Wait for more than 1 second: no exception</li><li>RunĀ `rabbitmqctl set_vm_memory_high_watermark 0.4`</li><li>TimeoutException is thrown</li></ol></div><div><div>I think this is because ChannelN.waitForConfirmsOrDie(long timeout) catches TimeoutException and calls:</div>

<div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">close(AMQP.PRECONDITION_FAILED, &quot;TIMEOUT WAITING FOR ACK&quot;);</blockquote><div><br></div><div>The call to `close` blocks indefinitely because the RabbitMQ connection is blocked. The TimeoutException does not get thrown until after the connection is unblocked.</div>

</div><div><br></div><div>As a workaround, I am calling `Channel.waitForConfirms(long timeout)` and throwing an exception if returns false.</div>
<div><br></div><div>Regards,</div><div>Stuart Sierra</div><div>Cognitect, Inc.</div></div>