Я пытаюсь настроить глобальное состояние для своего actix_web::HttpServer
, и похоже, что register_data
- правильный API (я могу ошибаться).
Из документации непонятно мне, как создать единый экземпляр данных приложения, совместно используемых всеми HttpServer
потоками. Вот мой фрагмент кода:
HttpServer::new(|| {
App::new()
.register_data(web::Data::new(Mutex::new(MyServer::new())))
.service(web::resource("/myservice").route(web::post().to(my_service)))
.service(web::resource("/list").to(list_service))
})
В обработчике POST my_service
я обновляю состояние MyServer
, а в обработчике GET list_service
он распечатывает состояние.
В то время как my_service
успешно сохраняет состояние, list_service
печатает только пустой вывод. Как узнать, создал ли HttpServer
единственный экземпляр MyServer
или нет? Если нет, как я могу гарантировать, что он создаст единственный экземпляр? В документации register_data
говорится:
Данные приложения не обязательно должны быть
Send
илиSync
. ВнутреннеData
тип используетArc
. если ваши данные реализуютSend
+Sync
черты, вы можете использоватьweb::Data::new()
и избегать двойныхArc
.
Меня это смущает. Что должен сделать пользователь, чтобы register_data
зарегистрировал единственный экземпляр объекта данных? Используется ли следующая строка в примере из документации создать единственный экземпляр или по одному экземпляру на поток?
.register_data(data.clone())
Я использую actix-web 1.0.9.