在事件中返回未来

时间:2019-04-18 10:07:00

标签: java spring future

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

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

当消息通过整个系统时,我收到一条消息,确认消息已被处理(通过RabbitMQ),但是必须阻止直到我得到此确认。

这是侦听器类的响应的代码阻止。

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

listener类扩展了处理从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在这里可能会有所帮助...但是我不确定如何在此处使用它。

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

1 个答案:

答案 0 :(得分:0)

因此,这就是我最终得到的解决方案...我将消息包装在CompletableFuture中,当消息通过.complete()方法传入时,将消息包装在receive()中。 / p>

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;
}