java - 如何用另一个 void 方法来阻止方法

标签 java spring spring-cloud spring-cloud-stream java-threads

我有监听器方法,它处理由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 超时可能更好)直到监听器 offerFoo ;然后删除 map 条目。

请记住,一旦 Foo 被放入队列,记录就会被确认,如果服务器崩溃,记录就会丢失。

关于java - 如何用另一个 void 方法来阻止方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52313453/

相关文章:

java - @Cacheable 是否知道 'Thundering Herd' 问题?

spring-security - 依赖于已弃用类的 OAuth2FeignRequestInterceptor 的替代方案

spring-boot - 启用 eureka.client.healthcheck

java - 如何从 Java 中的方法返回通用 Map

java 8 lambda - 多次使用流

java - ResultSet 关闭后不允许执行操作[SQL 异常]

java - 使用 MappingJackson2JsonView 支持在 Spring REST 中返回 JSON 响应比 @ResponseBody 注释有什么优势?

java - 如何管理 XML 模式及其生成的类的版本和部署?

java - 使用 Mockito 在客户端测试 POST 请求

spring-boot - 没有可用于服务 : while routing in Netflix ribbon 的服务器