2016-02-12 2 views
2

У меня есть мертвый обмен письмо, которое работает, как ожидалось, - когда я NACK сообщение он идет туда:RabbitMQ DLX как указать для каждого сообщения TTL в исходную очередь?

@Override 
public void onMessage(Message message, Channel channel) throws Exception { 
    // How to specify when the message will be put back to the original queue? 
    // This doesn't work. 
    message.getMessageProperties().setExpiration("3000"); 
    channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false); 
} 

Но то, что я не могу найти, как указать на-сообщение, когда сообщение должно быть возвращено к оригиналу очередь. Пожалуйста, порекомендуйте.

+0

Смотрите мой ответ здесь: http://stackoverflow.com/a/28636231/1173800 – jhilden

ответ

0

Заголовок истечения удаляется, когда сообщение мертво. Во-вторых, сообщения не будут автоматически отправляться обратно в исходную очередь из вашей очереди.

Похоже, что вы хотите систему повторных попыток с каждым временем ожидания сообщения. Это можно сделать, но не так, как вы это делаете сейчас.

Основной шаблон: вы получаете свое сообщение, а затем отправляете его на «задержку» обмена и очереди. Эта очередь устанавливает обмен мертвой буквой как обмен вашего приложения. Когда сообщение поступает в очередь ожидания, оно сидит там до тех пор, пока сообщение TTL не будет достигнуто и не будет замечено на ваш обмен приложениями. Однако это не работает, когда у вас есть переменные сообщения. Сообщения получают мертвую букву из заголовка очереди, поэтому сообщение с длительным истечением будет блокировать сообщения с более короткими истечениями за ним.

Таким образом, у вас есть различные варианты решения этой проблемы.

  1. Имейте несколько стандартных обменов задержки для выбора, у которых есть разные TTL-запросы на основе очереди, и не устанавливайте срок действия сообщения.
  2. Перед отправкой сообщения объявите временную задержку обмена (которая автоматически удаляется) и очередь (с TTL очереди, которая истекает через несколько секунд после истечения срока действия вашего сообщения). Отправьте свое сообщение, и он получит мертвое письмо после правильного количества времени, а затем обмен будет автоматически удален, и очередь истечет и будет удалена. Это может быть очень дорого, если у вас есть пики повторов. Однако, если вы укажете временный обмен и очередь после истечения срока действия, он будет повторно использоваться другими сообщениями с тем же TTL, который отправляется в течение того же периода.
  3. NServiceBus имеет остроумную методику с использованием нескольких обменов задержки и очереди: https://docs.particular.net/nservicebus/rabbitmq/delayed-delivery