2014-11-10 1 views
2

Я хочу отправить столик в качестве части сообщения акк актера. Чтобы удаленный актер с другого конца мог подключиться к базе данных и выполнять операции CRUD в базе данных mysql. Я не могу получить голову над пятнистыми типами, и я нахожу жалобы компилятора/затмения. Как я могу это сделать. Это хорошая идея, чтобы передать slick-запросы как часть сообщений актера.Прохождение scala slick table в сообщении аккера akka

object RemoteActorMessages { 
    case class Create(table: Table[A]) 
    case class RunQuery(query: Query[_, _, _]) 
    case Result(code: Int, message: String) 
} 

class DBActor extends Actor { 
    def recieve = { 
    case Create(table) => createTable(table) 
    case RunQuery(query) => runQuery(query) 
    case ... //so on 
    } 
} 

def createTable(table: Table[M]): Future[A] = Future { 
    db.withSession(implicit session => tableQuery[table].ddl.create) 
} 

def runQuery(query: Query[_, _, _]): Future[A] = Future { 
    db.withSession { implicit session => { 
             query.run 
            } 
            } 
} 

предупреждение: код может иметь некоторый тип errors.Discretion ценится из зрителей

Я смущен о том, как отправить результаты обратно отправителю сообщения. например: query.list.run возвращает список объектов модели. Итак, как мне создать кадр из сообщения Result

+1

Почему бы не отправить детали как сообщения деталей, а затем создать запрос на сервере. Что такое ошибка/предупреждение. – korefn

+0

@korefn, как я могу отправить сообщение в ** DbActor ** для создания таблицы в базе данных. – pamu

+0

@korefn. Я хочу включить общий тип в сообщение ** DBActor **, чтобы любой конкретный тип таблицы мог быть отправлен на него, как и в случае инъекции зависимостей. После этого ** DBActor ** может вызывать ddl.create в родовом типе для создания таблицы в базе данных. – pamu

ответ

0

Я думаю, что это случай «когда у вас есть молот, все становится гвозди». Я считаю, что это не правильный вариант для актеров. Причина (а не единственная) заключается в том, что операции с БД являются «медленными», и они будут блокировать потоки актеров в течение длительного времени.

Возможно, вам нужна служба, которая управляет операциями таблицы, используя фьючерсы и пользовательский контекст выполнения, чтобы изолировать воздействие (например, в Play выполняется like this). Что-то вроде:

object DBService { 
    def createTable() : Future[Boolean] = ??? 
    ... 
} 

Актеры должны получить такие команды, как CreateTable, которые затем вызвать соответствующий метод в службе только.

Кстати, это упростит ваш прецедент, поскольку служба может узнать больше о таблице и других особенностях Slick, в то время как актер не обратит на них внимания.

Не единственный способ, но, возможно, более простой.

+0

все, что вы сказали, абсолютно правильно, тем самым я делаю DBActor глухими к другим запросам. Но я не беспокоюсь об этом, о том, как мне отправить ** таблицу [A] ** актеру, чтобы я мог создать из него табличный запрос, а затем обернуть создание таблицы в будущем, чтобы не сделать актера глухой. – pamu

 Смежные вопросы

  • Нет связанных вопросов^_^