Интеграция RabbitMQ + Spring. Размер очереди 1, удаляется только при переопределении

Теперь я хотел бы реализовать эту идею с помощью RabbitMQ и Spring Integration:

  1. Одна очередь, вместимостью 1 сообщение.
  2. Потребители будут запрашивать это сообщение, если оно существует в очереди, оно будет доставлено им, если нет, они получат нулевое значение или ошибку.
  3. Это сообщение (если существует в очереди) не будет удалено из-за того, что оно было загружено, оно будет удалено только тогда, когда производитель поместит в очередь другое новое сообщение.

С наилучшими пожеланиями!


person Guillermo Garcia    schedule 14.12.2017    source источник


Ответы (1)


Что-то вроде этого:

@Transactional
public Message getMessageFromQueue(String queue) {
    try {
        return this.rabbitTemplate.receive(queue);
    }
    finally {
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}

С областью транзакции мы будем опрашивать очередь внутри транзакции. С помощью setRollbackOnly() мы откатываем TX и, следовательно, возвращаем сообщение в очередь обратно.

person Artem Bilan    schedule 14.12.2017
comment
Дайте мне исключение: org.springframework.transaction.NoTransactionException: нет управляемого аспектом транзакции TransactionStatus в области действия - person Guillermo Garcia; 14.12.2017
comment
Правильно, вы должны @EnableTransactionManagement в контексте вашего приложения, прежде всего: docs.spring.io/spring/docs/5.0.2.RELEASE/ - person Artem Bilan; 14.12.2017
comment
Да в следующий раз. спасибо - person Guillermo Garcia; 18.12.2017
comment
Я проголосовал за ваш вопрос: возможно, у вас уже есть разрешение принимать ответы. Общая проблема заключается в том, что люди с похожей проблемой рассмотрят решение, если увидят принятый ответ. - person Artem Bilan; 18.12.2017
comment
Похоже теперь хотя бы разрешите мне участвовать в мете. Я буду продолжать участвовать, чтобы выиграть больше разрешений. Спасибо за совет и за голос - person Guillermo Garcia; 18.12.2017