加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala Slick:永无止境

发布时间:2020-12-16 18:39:33 所属栏目:安全 来源:网络整理
导读:使用Slick,您可以执行以下操作以从表中生成结果流: val q = for (e - events) yield e.nameval p: DatabasePublisher[String] = db.stream(q.result)p.foreach { s = println(s"Event: $s") } 这将打印事件表中的所有事件,并在最后一行之后终止. 假设您可以
使用Slick,您可以执行以下操作以从表中生成结果流:

val q = for (e <- events) yield e.name
val p: DatabasePublisher[String] = db.stream(q.result)

p.foreach { s => println(s"Event: $s") }

这将打印事件表中的所有事件,并在最后一行之后终止.

假设您可以通过某种方式通知事件表中何时输入新行,是否可以编写一个在插入事件时连续输出事件的流?一种DB表的尾部-f.

我认为Slick本身不支持这个,但我认为应该可以使用Akka流媒体来提供帮助.因此,如果您可以从Slick Source获取某些东西,直到它为空,那么等待一个事件来指示表中的更多数据,然后流式传输新数据.可能通过使用ActorPublisher绑定此逻辑?

只是想知道某人是否有这方面的经验或任何建议?

解决方法

你是关于ActorPublisher :)这是一个使用PostgreSQL,async DB driver和 LISTEN/NOTIFY mechanism的简单例子:

演员:

class PostgresListener extends ActorPublisher[String] {

  override def receive = {
    case _ ?
      val configuration = URLParser.parse(s"jdbc://postgresql://$host:$port/$db?user=$user&password=$password")
      val connection = new PostgreSQLConnection(configuration)
      Await.result(connection.connect,5.seconds)

      connection.sendQuery(s"LISTEN $channel")
      connection.registerNotifyListener { message ? onNext(message.payload) }
  }
}

服务:

def stream: Source[ServerSentEvent,Unit] = {
  val dataPublisherRef = Props[PostgresListener]
  val dataPublisher = ActorPublisher[String](dataPublisherRef)

  dataPublisherRef ! "go"

  Source(dataPublisher)
    .map(ServerSentEvent(_))
    .via(WithHeartbeats(10.second))
}

libraryDependencies中的build.sbt:

"com.github.mauricio"  %% "postgresql-async"         % "0.2.18"

Postgres触发器应调用select pg_notify(‘foo’,’payload’)

据我所知,Slick不支持LISTEN.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读