我有监听器方法,它处理由Spring云流实现的消息,如下所示:
@StreamListener(value = MyInterface.INPUT)
public void handleMsg(@Payload Foo foo) {
// if (concurrentHashMap.containsKey(foo.getId())) concurrentHashMap.remove(foo.getId());
}
这是我的第二种方法,它应该被以前的方法阻止:
public Foo getFoo(long fooId) {
// here I need block method with some mechanism until handleMsg remove received object from map and return this foo from there
return fooFromStream;
}
我的目标是从服务类调用 getFoo
方法,如下所示:
// some logic
Foo foo = service.getFoo(fooId);
// some logic which required received foo;
我有想法将 getFoo
方法中的 Foo 包装到 AsyncResult 中,然后在导致 block 的 Future 结果上调用方法 get
,但我不知道如何传递 foo从流到方法 getFoo
用例应该是这样的:
我调用方法getFoo
,它将foo发送到消息代理并在map中注册foo,并执行一些逻辑,接下来当命令完成时,我在StreamListenner中接收消息,从map中删除foo,然后下一步我需要从方法 getFoo
返回 foo。
你能告诉我该怎么做或者解决这个问题的最佳实践是什么吗?谢谢您的建议。
最佳答案
目前还不完全清楚你想要做什么,但是 Map<Long, BlockingQueue<Foo>
将允许您阻止 take
(或者,poll
超时可能更好)直到监听器 offer
是Foo
;然后删除 map 条目。
请记住,一旦 Foo 被放入队列,记录就会被确认,如果服务器崩溃,记录就会丢失。
关于java - 如何用另一个 void 方法来阻止方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52313453/