2016-05-06 3 views
0

В принципе все, что я хочу сделать, это получить все пользователи из моей базы данных, который работал отлично до самого момента я хотел использовать засов для него:тупики с Play 2.5 Скале, ригеля 2,5 и MongoDB/Морфий

Я думаю, 4 Threads (количество процессоров) fork-join-executor уже используются, а затем есть какой-то тупик. Что я пробовал:

  • Повысить количество потоков исполнитель имеет, так, однако играть/Akka игнорирует мои настройки
  • Определить другой контекст выполнения фьючерса в контроллере, но это не мешает тупики, поскольку более чем четыре потока все еще ждут друг на друга
  • использование поточно-пул-исполнителя, но мои настройки игнорируются

смешанный код Scala/Java здесь:

class UserController { 
    def getUserList = deadbolt.Restrict(List(Array("Admin")))(){ implicit request => 
     Future { 
      val users = userModel.list 
      val json = Json.toJson(users) 
      Ok(json.toString) 
     }(
     } 
} 

Модель Пользователь не по существу, не более чем:

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; 
    } 
} 

Authorization Handler:

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 
      } 
     } 
     } 
    } 

Определение отдельный контекст засова не помогает:

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] 
) 
} 

пользовательского поставщика контекста :

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)) 
} 

Когда я пытаюсь это, выбрасывая некоторые случайные исключения, он никогда не бросали:

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)) 
} 
+0

Что произойдет, если вы дадите Deadbolt свой собственный контекст выполнения? Подробнее см. Https://deadbolt-scala.readme.io/docs/execution-context. –

+0

Спасибо за ваш ответ, я обновил вопрос. Кажется, это не помогает. HTTP-запрос по-прежнему иногда не заканчивается, и это происходит, если я удалю проверку безопасности с помощью deadbolt. Может быть, я провозгласил Контекстный провайдер неправильным? По пути: стандартный ригель Modul связывает это: связывают [ExecutionContextProvider] .чтобы [DefaultExecutionContextProvider], Не DeadboltExecutionContextProvider. –

+0

Я знаю - он предоставляет стандартный DeadboltExecutionContextProvider в случае, если пользовательский не связан. Странно, что ваше исключение не выбрасывается; попробуйте добавить точку останова в https://github.com/schaloner/deadbolt-2-scala/blob/master/code/app/be/objectify/deadbolt/scala/ExecutionContextProvider.scala#L42 и посмотреть, что произойдет. –

ответ

0

Это не ригели вину, но, однако MongoClient открыл новую тему, когда это было instantiated.Which произошло в нашем проект довольно часто, но не был закрыт должным образом, тем самым блокируя поток. Мы использовали Синглтон, и все отлично работало.