Я ищу подходящее решение для следующей проблемы.
Мой компонент получает сообщение и публикует его в распределенной системе. Исходный отправитель ожидает подтверждения того, что сообщение было обработано.
Я получаю подтверждение того, что сообщение было обработано (через 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 могут быть здесь полезны... но я не уверен, как их использовать здесь.
Спасибо за помощь или любые предложения!




Итак, теперь это решение, к которому я пришел... Я завернул сообщение в 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;
}