我想知道是否可以在Akka Futures中使用tinkerpop,到目前为止,当我将更改提交到图表时,它们不会持久存在。
我了解tinkerpop是一个线程本地库,这意味着我需要在以后的ODatabaseRecordThreadLocal.INSTANCE.set(thread)中再次设置我的线程

我尝试了以下方法,但未成功:

def test[T](graphChanges: => T): T = {
    val thread = ODatabaseRecordThreadLocal.INSTANCE.get
    try graphChanges finally {
      ODatabaseRecordThreadLocal.INSTANCE.set(thread)
      GraphPool.get("partitioned").commit
    }
}

// collect tinkerpop frames
test {
  future {
  // add changes to my tinkerpop frames
  }
}

我想在每个play.mvc.Http.Context上使用Tinkerpop线程

这是我要实现的示例项目:https://github.com/D-Roch/tinkerpop-play

最佳答案

问题

问题是Tinkerpop在本地工作线程。因此,您的更改仅提交给当前线程。在创建Scala future 时,您可以让环境选择,在哪个线程中执行 future 。而且环境并不了解,因此选择了错误的线程。

对于Akka future 来说,问题也类似。

future 会在哪个线程运行?

创建 future 时,要使用两个参数来创建它:

  • 应该执行的块
  • 应该执行块
  • Execution Context

    第二个参数通常作为隐式参数给出。但是您可以覆盖默认值。

    解决方案

    创建涉及Tinkerpop的 future 时,请使用在同一线程中运行每个块的执行上下文。

    例子:
    import scala.concurrent.ExecutionContext
    import java.util.concurrent.Executors
    
    implicit val ec=ExecutionContext.fromExecutorService(Executors.newSingleThreadExecutor)
    
    future {
        println(Thread.currentThread);
        future {
            println(Thread.currentThread)
        }
    }
    

    此代码在控制台上两次打印出相同的线程ID(经过Java 7和Scala 2.10.2测试)。

    注意:使用如此小的线程池很容易导致死锁或饥饿。仅将其用于Tinkerpop互动。

    您可以提供特殊方法tinkerpopFuture,该方法将块作为参数并返回将在tinkerpop线程中运行的Future。或者,您可以创建一个特殊的actor来封装所有tinkerpop交互(并使用特殊的tinkerpop execut上下文运行它们)。

    文学
  • 您可以看到一些用于创建执行上下文here的示例代码。
  • Akka Futures and execution contexts的文档
  • 关于scala - 如何与 Actor 一起使用Tinkerpop,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20885935/

    10-12 03:51