首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Play 2.5 scala、死栓2.5和MongoDB/Mor体的死锁

使用Play 2.5 scala、死栓2.5和MongoDB/Mor体的死锁
EN

Stack Overflow用户
提问于 2016-05-06 23:51:09
回答 1查看 198关注 0票数 0

基本上,我想要做的就是从我的数据库中获取所有用户,直到我想要使用死栓的那一刻,数据库才正常工作:

我认为分叉连接执行器的4个线程(处理器数目)已经全部被使用了,然后出现了某种死锁。我试过的事情:

  • 提高执行程序的线程数,但是play/akka忽略我的设置
  • 为控制器中的未来定义另一个执行上下文,但这并不能防止死锁,因为超过四个线程仍在彼此等待。
  • 使用线程池执行器,但我的设置被忽略。

这里有一个混合scala/java代码:

代码语言:javascript
复制
class UserController {
     def getUserList = deadbolt.Restrict(List(Array("Admin")))(){ implicit request =>
        Future {
          val users = userModel.list
          val json = Json.toJson(users)
          Ok(json.toString)
        }(
      }
}

用户模型本质上不过是:

代码语言:javascript
复制
public class UserModel {
  private MongoClient client  = new MongoClient();
    private Morphia morphia = new Morphia();
    protected Datastore datastore = morphia.createDatastore(client, "timetracking");
    public List<User> list(){
       return  datastore.find(User.class).asList();
    }
  public User findUserByName(String name){
    User found = datastore.createQuery(User.class).field("username").equal(name).get();
    return found;
    }
}

授权处理程序:

代码语言:javascript
复制
class AuthorizationHandler extends DeadboltHandler {
  val model = new UserModel

  override def getSubject[A](request: AuthenticatedRequest[A]): Future[Option[Subject]] =
    Future {
      blocking {
        request.subject match {
          case Some(user) =>
            request.subject
          case None =>
            val username = request.session.get("username")
            if (username.isDefined) {
              val user = model.findUserByName(username.get)
              if (user == null) {
                  None
              } else {
                val subject = new ScalaSubject(user.getUsername, user.getRole)
                Some(subject)
              }
            } else {
              None
            }
        }
      }
    }

定义单独的死栓上下文无助于:

代码语言:javascript
复制
package deadbolt.scala
import be.objectify.deadbolt.scala.DeadboltExecutionContextProvider
import be.objectify.deadbolt.scala.cache.HandlerCache
import play.api.inject.{Binding, Module}
import play.api.{Configuration, Environment}

class DeadBoldModule extends Module {
  override def bindings(environment: Environment,
                        configuration: Configuration): Seq[Binding[_]] = Seq(
      bind[HandlerCache].to[TimeTrackerHandelCache],
      bind[DeadboltExecutionContextProvider].to[ThreadPoolProvider]
  )
}

自定义上下文提供程序:

代码语言:javascript
复制
package deadbolt.scala
import java.io.InvalidObjectException
import java.util.concurrent.Executors
import be.objectify.deadbolt.scala.DeadboltExecutionContextProvider
import scala.concurrent.ExecutionContext

class ThreadPoolProvider  extends DeadboltExecutionContextProvider {
  override def get(): ExecutionContext =  ExecutionContext.fromExecutor(Executors.newFixedThreadPool(100))
}

当我尝试这样做时,抛出一些随机异常,它就不会被抛出:

代码语言:javascript
复制
package deadbolt.scala
import java.io.InvalidObjectException
import java.util.concurrent.Executors
import be.objectify.deadbolt.scala.DeadboltExecutionContextProvider
import scala.concurrent.ExecutionContext

class ThreadPoolProvider  extends DeadboltExecutionContextProvider {
  override def get(): ExecutionContext = throw new IllegalAccessError("asd");ExecutionContext.fromExecutor(Executors.newFixedThreadPool(100))
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-14 23:42:37

这不是死螺栓故障,但是MongoClient在我们的项目中经常发生instantiated.Which时打开了一个新线程,但是没有正确关闭,从而阻塞了线程池。我们用的是单子,一切都很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37082961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档