【发布时间】:2018-06-21 01:08:18
【问题描述】:
在必须向另一个服务发送消息以进行处理的休息端点上工作。它是一种微服务架构,所有服务都通过 Kafka 消息代理连接。
Spring 支持 @Async 用于异步方法,但它不能按预期工作。代码类似于
@RequestMapping(method = RequestMethod.GET, value = "/responses/{id}", produces = "application/json")
@Async
public CompletableFuture<Response> getResponseById(@PathVariable @Valid Long id) {
//some code
producer.send(id);
//other service will send the response back and kafka consumer will save it to the db
responseRepository.findById(id);
}
它不会等待消息从 kafka 返回。
这里缺少什么?
【问题讨论】:
-
我想我在这里遗漏了一些东西。据我所知
@Async与 Kafka 没有任何关系,那么您为什么在问题中提到 Kafka?此外,具有返回类型的@Async方法要求您使用Futures,我也没有看到您提出的问题。 -
好收获。我已经用
CompletableFuture更新了我的代码。我理解@Async的方式是异步方法。 -
Producer.send是异步的。 kafka.apache.org/0110/javadoc/org/apache/kafka/clients/producer/… 无处等待回复消息。您只需发送消息并立即查询数据库。 -
@Taylor 我该怎么做?
-
Kafka 用于异步分布式消息传递。如果你想等待回复,这可以通过 Kafka 来实现,但它不必要地复杂。您必须发送消息并继续检查数据库,直到看到您所期望的。考虑改用 HTTP(例如 REST)。
标签: java spring spring-boot apache-kafka