Refactor to send request and response without channels.

This commit is contained in:
Kavin 2023-12-14 20:37:19 +00:00
parent bfd4ac68e6
commit 5408d34a22
No known key found for this signature in database
GPG key ID: 6E4598CA5C92C41F

View file

@ -7,7 +7,6 @@ use jni::sys::jobject;
use jni::JNIEnv;
use reqwest::{Client, Method, Url};
use tokio::runtime::Runtime;
use tokio::sync::mpsc;
static RUNTIME: OnceLock<Runtime> = OnceLock::new();
static CLIENT: OnceLock<Client> = OnceLock::new();
@ -131,9 +130,10 @@ pub extern "system" fn Java_rocks_kavin_reqwest4j_ReqwestUtils_fetch(
let runtime = RUNTIME.get().unwrap();
// Create a channel for communication between tasks
let (tx, mut rx) = mpsc::channel(1);
let (err_tx, mut err_rx) = mpsc::channel(1);
// send request in a async task
{
let jvm = Arc::clone(&jvm);
let future = Arc::clone(&future);
runtime.spawn(async move {
// send request
@ -141,29 +141,6 @@ pub extern "system" fn Java_rocks_kavin_reqwest4j_ReqwestUtils_fetch(
match response {
Ok(response) => {
// Send response to the processing task
tx.send(response).await.unwrap();
}
Err(error) => {
// Send error to the error handling task
err_tx.send(error).await.unwrap();
}
}
});
{
let jvm = Arc::clone(&jvm);
let future = Arc::clone(&future);
runtime.spawn(async move {
// Receive the response from the first task
let response = rx.recv().await;
if response.is_none() {
return;
}
let response = response.unwrap();
// get response
let status = response.status().as_u16() as i32;
@ -173,6 +150,8 @@ pub extern "system" fn Java_rocks_kavin_reqwest4j_ReqwestUtils_fetch(
let body = response.bytes().await.unwrap_or_default().to_vec();
// send response in a blocking task
runtime.spawn_blocking(move || {
let mut env = jvm.attach_current_thread().unwrap();
let final_url = env.new_string(final_url).unwrap();
@ -214,20 +193,9 @@ pub extern "system" fn Java_rocks_kavin_reqwest4j_ReqwestUtils_fetch(
.unwrap();
});
}
{
let jvm = Arc::clone(&jvm);
let future = Arc::clone(&future);
runtime.spawn(async move {
// Receive the error from the first task
let error = err_rx.recv().await;
if error.is_none() {
return;
}
let error = error.unwrap();
Err(error) => {
// send error in a blocking task
runtime.spawn_blocking(move || {
let mut env = jvm.attach_current_thread().unwrap();
let error = error.to_string();
@ -253,6 +221,9 @@ pub extern "system" fn Java_rocks_kavin_reqwest4j_ReqwestUtils_fetch(
.unwrap();
});
}
}
});
}
_future.into_raw()
}