Как отправить сообщение в actix SyncArbiter из функции? - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь реализовать функцию, которая отправляет запрос в одноэлементный пул Actix r2d2 (DbExecutor), который обрабатывает запрос и возвращает ответ, который можно использовать в приложении (приложение musi c).

Поскольку я запрашиваю использование этого DBExecutioner во всем приложении, для меня нет смысла реализовывать ответ, отличный от представления модели. Я пытаюсь получить прямой ответ от пула базы данных.

Я реализовал обработчик для DbExecutor следующим образом.

Сначала я создаю одноэлементное представление пула базы данных:

db / mod.rs

pub fn shared_store() -> Store {
    let store = init_store();
    let store = match store {
        Some(store) => store,
        None => shared_store() // TODO wait for period
    };
    store
}

fn init_store() -> Option<Store> {
  ...
}

Затем я неявно создаю обработчики для этого экземпляра DbExecutor. Т.е. когда сообщение отправляется на DbExecutor, оно будет предоставлять соответствующий ответ, полученный в результате запроса к базе данных.

db/instruments.rs

#[derive(Debug)]
pub struct GetInstrumentList {}

#[derive(Debug)]
pub struct InstrumentListResponse {
    pub instruments: Vec<Instrument>,
}

impl Message for GetInstrumentList {
    type Result = Result<InstrumentListResponse>;
}

impl Handler<GetInstrumentList> for DbExecutor {
    type Result = Result<InstrumentListResponse>;

    fn handle(&mut self, msg: GetInstrumentList, _: &mut Self::Context) -> Self::Result {
       ... ommitted for brevity
    }
}

Моя проблема возникает при реализации следующих функций. Он должен возвращать Instrument ответ от SyncArbiter, однако он возвращает несоответствующий результат, как указано ответом, следующим за этим кодом:

service/instrument.rs

pub fn get_instruments_list(limit: Option<usize>, offset: Option<usize>) -> InstrumentListResponse {
    let db = shared_store().db.clone();
    let res = db.send(GetInstrumentList{
        params: InstrumentListParams{
            limit:limit,
            offset: offset
        }
    })
    .flatten().wait();

    res
}

45 | Res | ^^^ ожидаемая структура db::instruments::InstrumentListResponse, найдено перечисление std::result::Result | = примечание: ожидаемая структура db::instruments::InstrumentListResponse найдено enum std::result::Result<db::instruments::InstrumentListResponse, error::Error>

Как реализовать вышеуказанные функции таким образом, чтобы устранить эту ошибку?

...