Я ищу способ получить unack сообщения и вернуть их в состояние готовности, чтобы мой потребитель мог снова отправить эти сообщения.
Я использую java-клиент для получения сообщений, это моя программа для отправки и получения сообщений. Я читал, что есть метод basicRecover(), который вернет сообщение в очередь.
SendMessage
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
for(int i=0;i<1000;i++)
{
String message = "message goes here";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
channel.close();
connection.close();
}
Retrieve
try
{
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("10.4.4.19");
factory.setUsername("test");
factory.setPassword("test");
//factory.setPort(5267);
connection=factory.newConnection();
channel=connection.createChannel();
channel.basicQos(1);
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, false, consumer);
for(int i=0;i<1;i++)
{
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println(" [x] Received '" + message + "'");
// Thread.currentThread().sleep(3000);
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
channel.close();
connection.close();
}
catch(Exception e)
{
System.out.println("Error:"+e.getMessage());
e.printStackTrace();
}
кто-нибудь может предоставить мне фрагмент кода, чтобы сообщение unack могло быть возвращено в состояние готовности, и я могу использовать программу retrieve для их чтения.
Если вы не выполняете channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
чем сообщение будет (в конечном итоге) повторно доставлено. Вам не нужно информировать службу о том, что сообщение НЕ доставлено, оно работает над директором, что все, что НЕ было подтверждено как доставленное, НЕ доставлено.
Но, как вы прочтете в ссылке выше, единственный способ не подтвердить сообщение - это убить/закрыть соединение с сервисом.