簡體   English   中英

如何在播放/縮放中添加全局事務過濾器?

[英]How to add a global transaction filter in play/scala?

我正在嘗試設置一個全局過濾器,以將事務性添加到整個應用程序中。

object TransactionFilter extends Filter {
    def apply(next: (RequestHeader) => Future[SimpleResult])(request: RequestHeader): Future[SimpleResult] = {
        next(request)
    }
}

我正在使用squeryl,它使用如下塊:transaction {...}

object TransactionFilter extends Filter {
    def apply(next: (RequestHeader) => Future[SimpleResult])(request: RequestHeader): Future[SimpleResult] = {
        transaction { next(request) }
    }
}

當然,這也不起作用,因為這只是在Future [SimpleResult]的生成中增加了事務性。

我需要將Future [SimpleResult]的執行包裝在事務{...}塊中。

我該怎么做呢? 我已經搜索了。

附帶一提,我對使用動作合成不感興趣,我已經可以正常使用了。

object TransactionFilter extends Filter {
  def apply(next: (RequestHeader) => Future[SimpleResult])(request: RequestHeader): Future[SimpleResult] = {
    // Begin transaction
    val tx = beginTx

    // Do the work
    val f = next(request)

    // Commit on success
    f onSuccess {
      case result => commitTx(tx)
    }

    // Rollback on failure
    f onFailure {
      case t => rollbackTx(tx)
    }

    f
  }

  def beginTx: Int = 42
  def commitTx(tx: Int) = {}
  def rollbackTx(tx: Int) = {}
}

嘗試使用slick 2.0而不是squeryl。

在slick2中,TheadLocal會話被重命名為動態會話,而不是默認行為。 默認的是一個隱式會話,可以使用該會話而不會出現期貨問題

暫無
暫無

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

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