新しいクレートについてElastic Searchのブログ投稿でサンプルコードを使用していますが、意図したとおりに機能させることができません。スレッドはthread 'main' panicked at 'not currently running on the Tokio runtime.'
でパニックになります。
Tokioランタイムとは何ですか。どのように構成しますか。また、なぜそれが必要なのですか。
use futures::executor::block_on;
async elastic_search_example() -> Result<(), Box<dyn Error>> {
let index_response = client
.index(IndexParts::IndexId("tweets", "1"))
.body(json!({
"user": "kimchy",
"post_date": "2009-11-15T00:00:00Z",
"message": "Trying out Elasticsearch, so far so good?"
}))
.refresh(Refresh::WaitFor)
.send()
.await?;
if !index_response.status_code().is_success() {
panic!("indexing document failed")
}
let index_response = client
.index(IndexParts::IndexId("tweets", "2"))
.body(json!({
"user": "forloop",
"post_date": "2020-01-08T00:00:00Z",
"message": "Indexing with the Rust client, yeah!"
}))
.refresh(Refresh::WaitFor)
.send()
.await?;
if !index_response.status_code().is_success() {
panic!("indexing document failed")
}
}
fn main() {
block_on(elastic_search_example());
}
内部でtokio::run
(tokioバージョン= 0.2)を使用するクレートでtokio02
(tokioバージョン= 0.1から)を使用したときにも同じエラーが発生しました(私の場合はreqwestでした)。まず、std::future::Future
をfutures01::future::Future
に futures03::compat
で変更しました。コンパイルさせるため。実行後、正確にエラーが発生します。
tokio-compat を追加すると問題が解決しました。