【问题标题】:Spring Boot: Rest endpoint integration with KafkaSpring Boot:Rest 端点与 Kafka 的集成
【发布时间】: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


【解决方案1】:

尝试使用sync(blocking)方法发送消息 producer.send(id).get(); 这将使执行等待结果。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2018-03-07
    • 2017-02-17
    • 2017-06-07
    • 2019-03-03
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多