如何与演员一起使用Tinkerpop

Roc*_*och 5 scala thread-local akka playframework-2.0 tinkerpop

我想知道我是否可以在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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

ste*_*hke 7

问题

问题是,Tinkerpop工作线程本地.因此,您的更改仅提交给当前线程.在创建Scala期货时,您让环境选择,在哪个线程中执行未来.并且环境不是更好,所以它选择了错误的线程.

Akka期货的问题类似.

未来在哪个线程中运行?

创建未来时,您将使用两个参数创建它:

  1. 应该执行的块
  2. 应执行块的执行上下文

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

在创建处理Tinkerpop的期货时,使用执行上下文来运行同一线程中的每个块.

例:

import scala.concurrent.ExecutionContext
import java.util.concurrent.Executors

implicit val ec=ExecutionContext.fromExecutorService(Executors.newSingleThreadExecutor)

future { 
    println(Thread.currentThread); 
    future {
        println(Thread.currentThread)
    }  
}
Run Code Online (Sandbox Code Playgroud)

此代码在控制台上打印出相同的线程ID两次(使用Java 7和Scala 2.10.2进行测试.

注意:使用这么小的线程池很容易导致死锁或饥饿.仅用于您的Tinkerpop互动.

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

文献