В принципе все, что я хочу сделать, это получить все пользователи из моей базы данных, который работал отлично до самого момента я хотел использовать засов для него:тупики с 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))
}
Что произойдет, если вы дадите Deadbolt свой собственный контекст выполнения? Подробнее см. Https://deadbolt-scala.readme.io/docs/execution-context. –
Спасибо за ваш ответ, я обновил вопрос. Кажется, это не помогает. HTTP-запрос по-прежнему иногда не заканчивается, и это происходит, если я удалю проверку безопасности с помощью deadbolt. Может быть, я провозгласил Контекстный провайдер неправильным? По пути: стандартный ригель Modul связывает это: связывают [ExecutionContextProvider] .чтобы [DefaultExecutionContextProvider], Не DeadboltExecutionContextProvider. –
Я знаю - он предоставляет стандартный DeadboltExecutionContextProvider в случае, если пользовательский не связан. Странно, что ваше исключение не выбрасывается; попробуйте добавить точку останова в https://github.com/schaloner/deadbolt-2-scala/blob/master/code/app/be/objectify/deadbolt/scala/ExecutionContextProvider.scala#L42 и посмотреть, что произойдет. –