Как вы сказали подтверждение должно быть отправлено по тому же каналу
Подтверждение должно быть отправлено по тому же каналу, для которого была получена доставка.Попытки подтвердить использование другого канала приведут к исключению протокола уровня канала
Простой способ сделать это - использовать autoack=true
, поэтому сообщение будет автоматически подтверждено после его использования.
boolean autoAck = true; // acknowledgment is covered below
channel.basicConsume(TASK_QUEUE_NAME, autoAck, consumer);
РЕДАКТИРОВАТЬ
, если auto_ack не работает для вас, вы можете использовать channel_consumer.basicCancel(consumerTag);
что-то вроде этого:
final Consumer consumer = new DefaultConsumer(channel_consumer) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
try {
channel_consumer.basicCancel(consumerTag);
System.out.println(" [x] stopping" + message + "'");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" [x] elaborated getting ack" + message + "'");
channel_consumer.basicAck(envelope.getDeliveryTag(), false);
} finally {
System.out.println(" [x] Done");
}
}
};
boolean autoAck = false; // acknowledgment is covered below
channel_consumer.basicConsume("test", autoAck, consumer);