Анатолий Евладов:
Как то так.
Это взято из исходного кода плея, play.api.data.Form
val req = (request.body match {
case body: play.api.mvc.AnyContent if body.asFormUrlEncoded.isDefined => body.asFormUrlEncoded.get
case body: play.api.mvc.AnyContent if body.asMultipartFormData.isDefined => body.asMultipartFormData.get.asFormUrlEncoded
case body: Map[_, _] => body.asInstanceOf[Map[String, Seq[String]]]
case body: play.api.mvc.MultipartFormData[_] => body.asFormUrlEncoded
case _ => Map.empty[String, Seq[String]]
}) ++ request.queryString
val processedMap = req.map{ case (key, value) =>
val neyKey = key ///Convert key to necessary form here
(neyKey, value)
}
form.bindFromRequest(processedMap) //do some logic with form
Ну да, это костылек) С классами все более правильнее и лаконичнее. Поставьте классу UserApi аннотацию Singleton и вы получите практически тот же самый object. А вообще, мой совет - НЕ используте anorm. Смотрите в сторону slick.lightbend.com.
Анатолий Евладов: Раз это игрушка, то скорее всего API редко меняется, поэтому можно смело можно представить этот json в виде более удобного класса, для которго можно будет написать удобный интерфейс, например, для поиска каких то значений.
Удачи Вам)
Все просто) Две скобки, как я написал выше, это массив массовов, который можно представить в виде List[List[_]]. Теперь отстается определиться с типом данных во во втором (вложенном) массиве. В json там два типа данных - String и Int. В scala у этих типов два разных супер типа - AnyRef для String и AnyVal для Int, а общий супер тип для них Any (аналог Object в Java). Поэтому окончательный вид будет List[List[Any]]. Но с листом из листов я бы не стал работать в scala, а написал бы класс, наподобие того, что в ответе. Но это уже зависит от Вашей бизнес логики и откуда берется такой json).
Если нужно back pressure, тогда добро пожаловать в doc.akka.io/docs/akka/2.4.2/scala/stream/stream-cu... Не знаю, что там с эрлангом на эту тему( Но опять таки, сильно зависит от того, что и зачем Вы делаете. Может быть проще и эффективнее будет сделать казтомный mailbox.
Ну так да, "...Если у вас всего один актор будет так работать, то разница будет мало ощутима....". Что у вас происходит до этого актора? ИМХО, до актора нужно подтюнить логику работы что бы все было норм. Может быть Вам помогло бы processRequest отработать для первого запроса вообще вне актора а после того, как результат закомплититься создать целый пул акторов. Ну или feedingFromQueue будет брать из очереди сообщения и отсылать их целому пулу акторов.
Ваш вопрос был "нельзя ли обойтись без Await'а?". Я подкинул идею, как это можно сделать не блокировав контекст. Но для продакшина это мало годиться(
До тех пор, пока receive не отработает, новое сообщение в контекст актора не залезет. Если вы блокируйте контекст актора, то все сообщения будут накапливаться в его маилбоксе (что не есть хорошо). Если контекст не блокировать (futRespData.onComplete вызывается асинхронно и может выполнятся вообще говоря в другом executor) то нужно где то хранить новые сообщения. Поэтому там и очередь. Когда future отработал и можно дальше нормально жить, то из этой очереди вытаскиваются сообщения в порядке их поступления и обрабатываются сообщения из основного mailbox. Если у вас всего один актор будет так работать, то разница будет мало ощутима. Если же у вас целая армия акторов, то можно например, пока актор ждет ответа, то он посылает сообщения (пришедшие к нему) другим акторам, для которых future уже завершился. Как то так. Нужно больше деталей)
Андрей Титов: Не так( У вас уже есть переменная PATH, и нужно в нее добавить путь до скалы (D:\scala\bin\). Переменные окружения пишутся без процента, т.е. вместо % SCALA_HOME% нужно писать просто SCALA_HOME. А %PATH% вообще удалить (%НАЗВАНИЕ_ПЕРЕМЕННОЙ% - это ссылка в путях, т.е. например, PATH= %JAVA_HOME%;%SCALA_HOME% будет преобразован в PATH=\path\to\java;\scala\bin). Посмотрите, как сделано с переменной JAVA_HOME и как она в PATH выглядит, и сделайте по аналогии со скалой. Разберитесь сначала с путями (в 99% случаев все должно заработать), если же с путями все нормально, но ошибка все таже, то попробуйте отредактировать .bat файлик https://issues.scala-lang.org/browse/SI-7821. Если же и это не спасет, то будем думать....