我想知道我是否可以在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期货时,您让环境选择,在哪个线程中执行未来.并且环境不是更好,所以它选择了错误的线程.
Akka期货的问题类似.
创建未来时,您将使用两个参数创建它:
应该执行的块
应执行块的执行上下文
第二个参数通常作为隐式参数给出.但您可以覆盖默认值.
在创建处理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) } }
此代码在控制台上打印出相同的线程ID两次(使用Java 7和Scala 2.10.2进行测试.
注意:使用这么小的线程池很容易导致死锁或饥饿.仅用于您的Tinkerpop互动.
您可以提供一个特殊方法tinkerpopFuture,它将块作为参数并返回将在tinkerpop线程中运行的未来.或者你可以创建一个特殊的actor来封装所有的tinkerpop交互(并使用特殊的tinkerpop exection上下文来运行它们).
您可以在此处查看用于创建执行上下文的示例代码.
Akka期货和执行环境的文档