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
问题是,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)
}
}
Run Code Online (Sandbox Code Playgroud)
此代码在控制台上打印出相同的线程ID两次(使用Java 7和Scala 2.10.2进行测试.
注意:使用这么小的线程池很容易导致死锁或饥饿.仅用于您的Tinkerpop互动.
您可以提供一个特殊方法tinkerpopFuture,它将块作为参数并返回将在tinkerpop线程中运行的未来.或者你可以创建一个特殊的actor来封装所有的tinkerpop交互(并使用特殊的tinkerpop exection上下文来运行它们).
| 归档时间: |
|
| 查看次数: |
668 次 |
| 最近记录: |