Вернуть будущее в событие

Я ищу подходящее решение для следующей проблемы.

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

Я получаю подтверждение того, что сообщение было обработано (через RabbitMQ), когда сообщение прошло через всю систему, но должен заблокировать, пока не получу это подтверждение.

Это блокировка кода для ответа класса слушателя.

CompletableFuture<Boolean> messageReceived = listenerClass.isMessageReceivedMatching(identifier);
boolean messageConfirmation = messageReceived.join();
if (messageConfirmation) {
    sendMessagePorcessedConfirmationToOrigin();
}

Класс слушателя расширяет классы, обрабатывающие логику получения сообщения от RabbitMQ.

private Message message;

/**
*  Receives the message when it passed through the whole system.
*/
@Override
protected void receive(Message message) {
    this.message = message;
}

public CompletableFuture<Boolean> isMessageReceivedMatching(identifier) {
    //wait till a new message is received and the message is not null
    //match identifier and message
    //set message field back to null
}

Я действительно хочу избежать создания цикла while, ожидающего появления сообщения. В качестве альтернативы:

  • ApplicationEventPublisher и прослушивание конкретных событий, что тоже кажется неправильным решением.

  • Также было указано, что пружины ListenableFuture могут быть здесь полезны... но я не уверен, как их использовать здесь.

Спасибо за помощь или любые предложения!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
275
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, теперь это решение, к которому я пришел... Я завернул сообщение в CompletableFuture и .complete() его, когда сообщение приходит по методу receive().

CompletableFuture<Boolean> messageReceived = listenerClass.isMessageReceivedMatching(identifier);
boolean messageConfirmation = messageReceived.join();
if (messageConfirmation) {
    sendMessagePorcessedConfirmationToOrigin();
}
private CompletableFuture<Boolean> matchingMessage;
private String identifier;

@Override
protected void receive(Incident message) {
    if (omsIdentifier == null) {
        return;
    }

    if (matches(identifier)) {
        //if not already completed, sets the value
        matchingMessage.complete(true);
    } 
}

CompletableFuture<Boolean> isMessageReceivedMatching(String identifier) {
    this.identifier = identifier;
    matchingMessage = new CompletableFuture<>();
    return matchingMessage;
}

Другие вопросы по теме