繁体   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