我正在寻找适合以下问题的解决方案。
我的组件正在接收一条消息,并将其发布到分布式系统。原始发件人期望得到确认,消息已被处理。
当消息通过整个系统时,我收到一条消息,确认消息已被处理(通过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
在这里可能会有所帮助...但是我不确定如何在此处使用它。
感谢您的帮助或任何建议!
答案 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;
}