【问题标题】:Named event stream with Play 2.5 and server sent events使用 Play 2.5 和服务器发送事件的命名事件流
【发布时间】:2018-10-15 08:56:24
【问题描述】:

服务器发送事件中的默认事件名称/类型是“消息”。我正在尝试更改事件名称,但它不起作用。我正在使用 Play 2.5 和 akka 流。

(actorRef,sourcePublisher)=  Source
      .actorRef[T](10, OverflowStrategy.fail)
      .toMat(Sink.asPublisher(true))(Keep.both)
      .run()

backsource = Source.fromPublisher[T](sourcePublisher).named("test1")
Ok.chunked(backsource via EventSource.flow)
      .as(ContentTypes.EVENT_STREAM)

但它不会更改事件名称/类型。它仍在监听 message 事件而不是 test1。请建议。任何帮助表示赞赏。

【问题讨论】:

    标签: scala server-sent-events akka-stream playframework-2.5 eventsource


    【解决方案1】:

    我通过声明隐式 EventNameExtractor 解决了这个问题。下面是代码:

    隐式定义对[E]:EventNameExtractor[E] = EventNameExtractor[E](p => Some(("test1")))。

    成功了。

    【讨论】:

    • Abhinav,我们正在使用 Play/Akka 对 SSE 进行试验,但是一旦我们用尽了现有的资源,我们就会面临连接关闭的问题。在您的 POC 中,您是否能够长时间保持与客户端的连接?
    • 否.. 但浏览器会在断开连接后重新建立连接,并且事件将继续进行。或者你可以让一些任务通过流发送虚假数据,这将保持连接活跃。
    • 是的 Abhinav,我们观察到客户端重新连接的情况。但是,当服务器在这种情况下几个小时都没有任何东西时,这不是矫枉过正。这是工业界可接受的解决方案吗?其次,我们尝试在连接上发送虚拟数据以使其保持活动状态。但在那种情况下,浏览器会弹出 Aw Snap 错误。
    • 不确定这是否是最好的方法,但它确实有效。目前我正在定期发送心跳,但没有运气。如果您找到保持连接活跃的解决方案,请告诉我。如果我能弄清楚什么,我会告诉你的。
    • 所以我使用了keepAlive方法并且它有效。 keepAlive 定期发送心跳,即使没有数据,连接也会保持活动状态。 Ok.chunked(backsource.keepAlive(50.seconds, ()=>T) via EventSource.flow) .as(ContentTypes.EVENT_STREAM) 在我的情况下 T 是 json 所以我使用 keepAlive(50.seconds, ()=> json.obj("data"->"heartbeat")) doc.akka.io/api/akka/2.5/akka/stream/javadsl/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2015-10-26
    • 1970-01-01
    • 2013-01-11
    • 2013-12-29
    相关资源
    最近更新 更多