java - 返回事件的未来
问题描述
我正在为以下问题寻找合适的解决方案。
我的组件正在接收消息并将其发布到分布式系统。原始发件人期待确认消息已处理。
当消息通过整个系统时,我收到确认消息已处理(通过 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
并监听似乎也不是正确解决方案的特定事件。还指出Springs
ListenableFuture
在这里可能会有所帮助......但我不知道如何在这里使用它。
感谢您的帮助或任何建议!
解决方案
所以,这现在是我最终得到的解决方案......我将消息包装在 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;
}
推荐阅读
- c - C - 插入排序算法
- css - 编译SASS失败
- javascript - 在 reducer 中更新对象的状态
- moodle - Moodle REST API 获取所有课程列表和注册该特定课程的用户
- sql - 如何在 SQL Server 的 nvarchar(max) 类型列中存在的 json 结构中添加新属性
- java - 如何匹配给定的正则表达式模式以从字符串中获取子字符串
- mongodb - Mongo Spark 连接器写入 .options(replaceDocument,false) 给出异常
- python-3.x - 从网站上抓取不断变化的整数值
- angular - Angular 5中页面刷新时注销
- azure - 如何在 Azure Batch 中上传 .bat 文件并运行该 Batch 文件