
Anatoliy
17.07.2016
19:34:40
Хм... щас попробую

Denis
17.07.2016
19:34:44
или akka.actor.Status.Failure если был эксепшен

Anatoliy
17.07.2016
19:35:32
для pipeTo что надо импортировать?

Denis
17.07.2016
19:35:39
akka.pattern.pipe

Google

Denis
17.07.2016
19:36:03
а так же import context.dispatcher
ему нужен ExecutionContext вроде
а какой выигрыш от использования Akka тут вообще?

Anatoliy
17.07.2016
19:37:22
Эм...
case DeleteStash(stash_id: String) => {
import akka.pattern.pipe
import context.dispatcher
log.info(s"Убиваем записи во вкладке stash id: $stash_id")
PoeCurrencies.deleteWhereStash(stash_id) pipeTo sender
}
pipeTo - он не видит

Denis
17.07.2016
19:39:33
def deleteWhereStash(stash_id: String): Future[Boolean] = {
db.run(table.filter(_.stashId === stash_id).delete).map(_ => true)
}

Anatoliy
17.07.2016
19:40:53
Это поменял, но чего я этим добился - не понял. Мне даже не надо знать этот результат. Мне просто надо быть увереным что сначала я сделаю delete, а токльо затем пойдут insert'ы

Denis
17.07.2016
19:41:31
то что ты вызвал run и он выполнился еще не значит что delete выполнился
тебе же возвращается Future

Anatoliy
17.07.2016
19:42:02
Верно, потому и думал делать через ?, т.е. вроде как ответ должен вернуться. Т.е. я его должен дождаться прежде чем дальше ижти
А, всё, видимо сообразил
но pipeTo всё равно не работает

Aleksey
17.07.2016
19:42:26

Denis
17.07.2016
19:42:47
Я уже поправил )

Google

Aleksey
17.07.2016
19:43:00
Покажи, как поправил :)

Anatoliy
17.07.2016
19:43:12
def deleteWhereStash(stash_id: String): Future[Boolean] = {
db.run(table.filter(_.stashId === stash_id).delete).map(_ => true)
}

Aleksey
17.07.2016
19:43:16
А, вижу

Anatoliy
17.07.2016
19:43:27
Теперь уровень выше
case DeleteStash(stash_id: String) => {
import akka.pattern.pipe
import context.dispatcher
log.info(s"Убиваем записи во вкладке stash id: $stash_id")
PoeCurrencies.deleteWhereStash(stash_id) pipeTo sender
}
pipeTo - он не видит
Импорт не произошел

Denis
17.07.2016
19:43:45
)

Anatoliy
17.07.2016
19:44:10
Я тут тоже накосячил, да?..

Denis
17.07.2016
19:44:29
вроде ок выглядит все

Aleksey
17.07.2016
19:44:35
Пайту таймаут нужен

Denis
17.07.2016
19:44:40
разве?

Anatoliy
17.07.2016
19:44:45
угу, заработало когда import akka.pattern.pipe
import context.dispatcher
вынес в самый верх

Aleksey
17.07.2016
19:44:52
Вроде бы да. implicit val timeout = Timeout(5 seconds)

Anatoliy
17.07.2016
19:45:19
Таймаут там нужен, что бы в случае чего сгенерить ошибку

Denis
17.07.2016
19:45:30
не не нужен http://doc.akka.io/api/akka/2.0/akka/pattern/package.html
аску нужен да

Anatoliy
17.07.2016
19:45:50
import akka.pattern.ask
implicit val timeout = Timeout(5 seconds)
val future = dbActor ? DeleteStash(stash.id) // enabled by the “ask” import
val result = Await.result(future, timeout.duration).asInstanceOf[Boolean]

Aleksey
17.07.2016
19:45:53
Верно.

Anatoliy
17.07.2016
19:45:56
Но я то делаю так?
Или можно так же по другому как то?

Google

Denis
17.07.2016
19:46:27
(dbActor ? DeleteStash(stash.id)).mapTo[Boolean]
для начала

Anatoliy
17.07.2016
19:47:07
Так?
import akka.pattern.ask
implicit val timeout = Timeout(5 seconds)
val future = (dbActor ? DeleteStash(stash.id)).mapTo[Boolean]
val result = Await.result(future, timeout.duration)
println(s"stash clear results: $result ${stash.accountName} ${stash.id}")

Aleksey
17.07.2016
19:47:22
Таймаут можно прибить. Сорри.

Anatoliy
17.07.2016
19:47:39
т.е. без await щас делать?
но мне в любом случае future развернуть же надо?

Aleksey
17.07.2016
19:47:53
Await надо менять на flatMap.

Denis
17.07.2016
19:48:14
да там не нужен flatMap

Anatoliy
17.07.2016
19:48:20
здесь по идее просто map можно

Denis
17.07.2016
19:48:23
там onComplete достаточно
чтобы потом себе же послать сообщение

Anatoliy
17.07.2016
19:48:31
хм...

Aleksey
17.07.2016
19:48:35
Если там дальше еще один аск, то почему бы нет?

Anatoliy
17.07.2016
19:48:43
там нет асков еще

Denis
17.07.2016
19:48:45
а где?

Anatoliy
17.07.2016
19:48:58
дальше идет просто отправка инсертов, я их отсылаю и забываю про них

Aleksey
17.07.2016
19:49:30
val f1: Future[Int] = Future.sucessful(0)
val f2: Future[Int] = Future.sucessful(1)
val f3 = f1.flatMap(x => f2.map(y => x + y))
f3 pipeTo sender()

Denis
17.07.2016
19:49:41
Имхо это все проще сделать на чистых Future, ты запаришься очень скоро так работать с Аккой и профита особого не видно

Anatoliy
17.07.2016
19:50:03
ну профит там есть, там не толкьо эта задача висит

Denis
17.07.2016
19:50:09
Ну ок )

Google

Aleksey
17.07.2016
19:50:22
От акки вообще никакого профита в стейтлес приложениях.

Anatoliy
17.07.2016
19:50:22
просто косяк произошел видимо только здесь
стейтлес?

Denis
17.07.2016
19:50:50
Что значит стейтлесс? )

Anatoliy
17.07.2016
19:51:08
угу)

Denis
17.07.2016
19:51:10
Просто у всех разное понимание )

Aleksey
17.07.2016
19:51:50
Дословно "без состояния". Пришел запрос, обработали отправили ответ. Все хранится где-нибудь еще. На пример в бд. Или в кэше.


Denis
17.07.2016
19:52:26
(dbActor ? DeleteStash(stash.id)).onComplete { case Success(_) => println(s"stash clear results: $result ${stash.accountName} ${stash.id}")
stash.stashType match {
case "CurrencyStash" =>
if (stash.items.isDefined) {
self ! CurrenciesParse(stash.accountName, stash.lastCharacterName, stash.id, curTimeFormat.format(today), stash.items.get)
} else {
self ! ItemsNotFound
}
case "PremiumStash" =>
if (stash.items.isDefined) {
self ! ItemsParse(stash.accountName, stash.lastCharacterName, stash.id, curTimeFormat.format(today), stash.items.get)
} else {
self ! ItemsNotFound
}
case "NormalStash" =>
if (stash.items.isDefined) {
self ! ItemsParse(stash.accountName, stash.lastCharacterName, stash.id, curTimeFormat.format(today), stash.items.get)
} else {
self ! ItemsNotFound
}
case r => log.warning(s"Неизвестный тип вкладки: $r")
} case Failure(e) => // handle exception }


Anatoliy
17.07.2016
19:52:51
там хранится в БД всё, но дальше в планах иметь состояния стешей в самой акке, т.е. при запуске - она это дело должна взять из базы и сформировать стеши, а потом просто вносить изменения

Admin
ERROR: S client not available

Denis
17.07.2016
19:52:55
Ну Акка отлично для таких штук подходит
Только зачем оборачивать доступ к базе в актор? Какой плюс от этого?
почему бы не заинжектит простой интерфейс

Anatoliy
17.07.2016
19:54:38
вот, значит я по идее выбрал верно
думал над этим, учитывая что сам слик тоже через акторы работает - видимо зря я еще одну прослойку добавил
но удалять уже буду когда начну переходить на хранение состояний

Aleksey
17.07.2016
19:57:09

Anatoliy
17.07.2016
19:59:24
(dbActor ? DeleteStash(stash.id)).onComplete {
case Success(_) =>
case Failure(e) =>
}
это же надо? import akka.actor.Status.{Failure, Success}
а по кластеру - там не настолько много всего будет, может пара десятков тысяч записей, вряд ли больше

Denis
17.07.2016
20:02:16
да так

Google

Anatoliy
17.07.2016
20:02:28
тогда я не понимаю чего он опять возмущается
говорит что хочет Try[Any]

Denis
17.07.2016
20:03:12
ты mapTo забыл

Aleksey
17.07.2016
20:03:13
Нет. Там другой пакет

Denis
17.07.2016
20:03:19
аа
ну да нет )
scala.util._


Anatoliy
17.07.2016
20:04:15
верно, спасибо, щас буду пробовать тогда
Кстати может глупый вопрос, но... как проще всего переделать ActorLogging что бы в случае log.error он писал в файл?
(dbActor ? DeleteStash(stash.id)).mapTo[Boolean].onComplete {
case Success(_) => {
if (stash.public) {
stash.stashType match {
case "CurrencyStash" =>
if (stash.items.isDefined) {
self ! CurrenciesParse(stash.accountName, stash.lastCharacterName, stash.id, curTimeFormat.format(today), stash.items.get)
} else {
self ! ItemsNotFound
}
case "PremiumStash" =>
if (stash.items.isDefined) {
self ! ItemsParse(stash.accountName, stash.lastCharacterName, stash.id, curTimeFormat.format(today), stash.items.get)
} else {
self ! ItemsNotFound
}
case "NormalStash" =>
if (stash.items.isDefined) {
self ! ItemsParse(stash.accountName, stash.lastCharacterName, stash.id, curTimeFormat.format(today), stash.items.get)
} else {
self ! ItemsNotFound
}
case r => log.warning(s"Неизвестный тип вкладки: $r")
}
}
}
case Failure(e) => log.error("Стеш не очистился")
}
В итоге получилось так, щас буду пробовать


Denis
17.07.2016
20:07:30
подключить и настроить logback
читай документацию к Акке она хорошая
лучше сделай stashType не строкой sealed trait c разными case object
тогда не надо будет на уровне актора обрабатывать всякую хрень
ты ее отловишь на уровне парсинга

Anatoliy
17.07.2016
20:09:21

Denis
17.07.2016
20:09:25
и тогда вся эта хрень с onComplete превратится в map().pipeTo(self)
sealed trait StashType object StashType { case object NormalStash extends StashType … }
блин
форматирование не работает
У тебя сейчас там строки
из за этого актор работает с потениально невалидным вводом