Sou novo em ferrugem, então esta é uma pergunta sobre tauri + ferrugem em geral. Estou tentando construir este aplicativo onde tenho um comando que inicia um thread que publica muitas mensagens no RabbitMQ e, em seguida, emite um evento quando a publicação é concluída. Eu tenho uma ConnectionMutex
estrutura gerenciada usando tauri
a API de estado e também estou obtendo o identificador da janela para emitir eventos. o código se parece com o seguinte:
use tauri::async_runtime::Mutex;
pub struct ConnectionMutex(pub Mutex<Option<RabbitMqConnection>>);
#[tauri::command]
pub async fn publish_message(
connection_mutex: tauri::State<'_, ConnectionMutex>,
window: tauri::Window,
) -> Result<(), String> {
tauri::async_runtime::spawn(async move {
let lock = connection_mutex
.0
.try_lock()
.map_err(|_| String::from("cannot change connection while it is being used"))
.unwrap();
let conn = lock.as_ref().ok_or("no rabbitmq connection").unwrap();
let _ = rabbitmq::publishing::publish(
&conn.target,
&conn.channel,
window,
)
.await;
});
Ok(())
}
Recebo um erro do compilador dizendo: borrowed data escapes outside of function
. esse erro faz sentido para mim, entendo por que isso não seria seguro porque o verificador de ferrugem não poderia mais rastrear a variável emprestada e não será capaz de liberá-la no momento correto. No entanto, não tenho ideia da maneira correta de conseguir esse tipo de coisa na ferrugem.
Também tentei definir o tempo de vida da State
variável como estático, assim:
#[tauri::command]
pub async fn publish_message(
connection_mutex: tauri::State<'static, ConnectionMutex>,
window: tauri::Window,
) -> Result<(), String>
mas recebo um erro diferente:__tauri_message__ does not live long enough
Obrigado pela sua ajuda!
Uma abordagem comum é agrupar o
Mutex
inArc
para que você possa compartilhar com segurança referências ao subjacenteMutex
entreasync
tarefas. (Veja também o exemplo na documentação ).Então você
ConnectionMutex
poderia ficar assim:Então, quando você quiser passar a conexão ao gerar uma
async
tarefa, primeiro vocêclone()
deveConnectionMutex
fornecer à tarefa sua própria cópia da referência.