如何通过PlayFramework中的Websockets将Kafka流中的数据发送给客户端?

时间:2016-05-18 16:48:50

标签: scala playframework websocket apache-kafka kafka-consumer-api

我正在使用Playframework和Scala。我试图从Kafka使用数据,处理数据,然后通过websockets将数据推送到客户端。不幸的是,我仍然是这项技术的新手。

当浏览文档时,他们提到要在创建websockets时创建一个actor。以下代码来自网站。 web socket

import play.api.libs.json.JsValue
import play.api.mvc._
import play.api.libs.streams._

class Controller4 @Inject() (implicit system: ActorSystem, materializer: Materializer) {
  import akka.actor._

  class MyWebSocketActor(out: ActorRef) extends Actor {
     import play.api.libs.json.JsValue
     def receive = {
       case msg: JsValue =>
        out ! msg
     }

     // do i include my kafka consumer here???

  }

  object MyWebSocketActor {
    def props(out: ActorRef) = Props(new MyWebSocketActor(out))
  }

  def socket = WebSocket.accept[JsValue, JsValue] { request =>
    ActorFlow.actorRef(out => MyWebSocketActor.props(out))
  }
}

我的问题是,我在哪里放置Kafka消费者代码。我把它放在演员里面吗?这是最佳做法吗?我担心将kafka消费者放在那里的原因是它会阻止它。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

Akka Streams + Reactive Kafka实际上让这很容易。只需将Kafka Source连接到WebSocket Source,即可通过WebSocket将Kafka消息发送到客户端。这是一个包含代码的完整演示: https://www.jamesward.com/2016/05/25/combining-reactive-streams-heroku-kafka-and-play-framework/