@scala_ru

Страница 20 из 1499
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 всё равно не работает

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
вот, значит я по идее выбрал верно

думал над этим, учитывая что сам слик тоже через акторы работает - видимо зря я еще одну прослойку добавил

но удалять уже буду когда начну переходить на хранение состояний

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

блин

форматирование не работает

У тебя сейчас там строки

из за этого актор работает с потениально невалидным вводом

Страница 20 из 1499