繁体   English   中英

使用 Java 的 Kafka Consumer in play 框架

[英]Kafka Consumer in play framework using java

我已经在 J​​ava 语言的 play 框架中搜索了数千个站点以获取 kafka 消费者示例。 但找不到任何例子。 任何人都可以提供有关如何编写连续使用 kafka 生成的主题的服务的详细信息。

谢谢

Play 是一个网络框架。 底层的 Actor 系统依赖于 Akka。

Akka Kafka API被称为 Alpakka ,所以我怀疑您在搜索错误的关键字

要将 Akka 和 Play 与 Kafka 结合使用,您甚至可以使用Lagom 框架


否则,当然你也可以使用普通的 Java 消费者,而不管 Play 框架如何

提供有关如何编写持续使用 kafka 生成的主题的服务的详细信息

KafkaConsumer c = new KafkaConsumer(props);
while (true) {
    ConsumerRecords r = c.poll(1000);
    ...
}

最近我也遇到了类似的问题,所以我会在研究后补充一些笔记。

我将描述如何在 Play Framework 中使用普通的 KafkaConsumer(但在 Scala 中不是 Java)。 了解低级组件的工作原理总是值得的,但毕竟我强烈建议您考虑使用像Alpakka这样的 例如,在我的上一个项目中,我决定使用基于 Alpakka 的 akka-projection 它与 Akka 很好地组合在一起,并为您提供一些额外的价值,例如在失败时轻松配置重启策略。

在 Play Framework 中使用普通的 KafkaConsumer:

  1. 创建将管理KafkaConsumer Singleton 。 在以下示例中, while循环在专用线程中运行。 普通KafkaConsumer在应用程序关闭期间关闭。
@Singleton
class SampleKafkaConsumer @Inject()(coordinatedShutdown: CoordinatedShutdown) extends Logging {

  logger.info("SampleKafkaConsumer starts")

  private val executionContext: ExecutionContext = ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor())
  private val stopConsumer: AtomicBoolean = new AtomicBoolean(false)

  private val properties = new Properties()
  properties.put("bootstrap.servers", "localhost:6003")
  properties.put("group.id", s"sample-group-id")
  properties.put("key.deserializer", classOf[StringDeserializer])
  properties.put("value.deserializer", classOf[StringDeserializer])

  val kafkaConsumer = new KafkaConsumer[String, String](properties)
  kafkaConsumer.subscribe(Set("sample-topic").asJava)

  Future {
    while (!stopConsumer.get()) {
      kafkaConsumer.poll(Duration.ofSeconds(60)).asScala
        .foreach(r => {
          logger.info(s"SampleKafkaConsumer receives record: $r")
        })
    }
    logger.info(s"SampleKafkaConsumer quits 'while(true)' loop.")
  }(executionContext)
  .andThen(_ => kafkaConsumer.close())(executionContext)
  .andThen {
    case Success(_) =>
      logger.info(s"SampleKafkaConsumer succeed.")
    case Failure(e) =>
      logger.info(s"SampleKafkaConsumer fails.")
  }(executionContext)

  coordinatedShutdown.addTask(CoordinatedShutdown.PhaseServiceStop, "SampleKafkaConsumer-stop"){() =>
    logger.info("Shutdown-task[SampleKafkaConsumer-stop] starts.")
    stopConsumer.set(true)
    Future{ Done }(executionContext).andThen{
      case Success(_) => logger.info("Shutdown-task[SampleKafkaConsumer-stop] succeed.")
      case Failure(e) => logger.error("Shutdown-task[SampleKafkaConsumer-stop] fails.", e)
    }(executionContext)
  }
}
  1. 使用 play 模块将其标记为“eager”:
class KafkaModule extends AbstractModule with Logging {

  override def configure(): Unit = {
    logger.info("Starting KafkaModule")
    bind(classOf[SampleKafkaConsumer]).asEagerSingleton()
  }
}

3.在播放配置文件中启用您的模块:

play.modules.enabled += "kafka.KafkaModule

这就是全部。 我在这里详细描述了一切。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM