簡體   English   中英

我怎樣才能使隱式字段成為瞬態的?

[英]How can I make an implicit field, transient?

我想在 apache Flink 的 AsyncFunction 中設置 doobie,但它需要一個隱式讀取輸出實例。 另一方面,我不能將 Read[Out] 作為隱式參數發送,因為 AsyncFunction 需要是可序列化的,而這個隱式值違反了這條規則:

package FlinkHelpers
import Configs.JdbConfig
import doobie.hikari._
import doobie._
import doobie.implicits._
import doobie.util.ExecutionContexts
import cats._
import cats.data._
import cats.effect.IO.asyncForIO
import cats.effect._
import cats.implicits._
import fs2.Stream
import cats.effect.unsafe.implicits.global
import org.apache.flink.runtime.concurrent.Executors
import org.apache.flink.streaming.api.scala.async.{AsyncFunction, ResultFuture}

import scala.concurrent.{ExecutionContext, Future}
import scala.util.Try
class AsyncDatabaseRequestOne[In,Out](configs:JdbConfig)(implicit r:Read[Out]) extends AsyncFunction[In,(In, Out)] {
  lazy val transactor: Resource[IO, HikariTransactor[IO]] = {
    for {
      ce <- ExecutionContexts.fixedThreadPool[IO](32)
      xa <- HikariTransactor.newHikariTransactor[IO](
        "org.postgresql.Driver",
        "jdbc:postgresql://localhost:5433/doobie",
        "psql",
        "110271",
        ce
      )
    } yield xa
  }
  /** The context used for the future callbacks */
  implicit lazy val executor: ExecutionContext = ExecutionContext.fromExecutor(Executors.directExecutor())

  override def asyncInvoke(input: In, resultFuture: ResultFuture[(In, Out)]): Unit = {
    val v2: IO[Out] = transactor.use[Out] { xa2: HikariTransactor[IO] => {
      sql"select code,name,population,gnp from Out limit 1"
        .query[Out] // Query0[String]
        .unique // ConnectionIO[List[String]]
        .transact(xa2) // IO[List[String]]
    }
    }
    val future = v2.unsafeToFuture()
    future.onSuccess({
      case result: Out => resultFuture.complete(List((input, result)))
    })
  }
}

另一方面,scala 不允許我使r字段變態,有誰知道我該如何解決這個問題嗎?

r class AsyncDatabaseRequestOne[In,Out](configs:JdbConfig)(r:Read[Out])...中的 r 是構造函數參數,但 Scala 也可以為其生成private[this]字段:

消除與超類的類字段同名的構造函數參數的歧義答案

嘗試添加注解@transient

class AsyncDatabaseRequestOne[In,Out](configs:JdbConfig)(@transient private[this] implicit val r:Read[Out])...

要么

class AsyncDatabaseRequestOne[In,Out](configs:JdbConfig)(@(transient @field) private[this] implicit val r:Read[Out])...

因為@transient已經用@field定義了

@field
final class transient extends scala.annotation.StaticAnnotation

我想在我們的例子中@field元注釋是沒有必要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM