首页 > 解决方案 > 返回事件的未来

问题描述

我正在为以下问题寻找合适的解决方案。

我的组件正在接收消息并将其发布到分布式系统。原始发件人期待确认消息已处理。

当消息通过整个系统时,我收到确认消息已处理(通过 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循环。或者:

感谢您的帮助或任何建议!

标签: javaspringfuture

解决方案


所以,这现在是我最终得到的解决方案......我将消息包装在 a 中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;
}


推荐阅读