pub async fn run(&self, socket_addr: SocketAddr) -> Result<(), Box<dyn Error>> {
let listener = TcpListener::bind(socket_addr).await?;
tokio::spawn(self.start_health_checking());
while let Ok((inbound, _)) = listener.accept().await {
if let Some(server) = self.random_server() {
let transfer = LoadBalancer::transfer(inbound, server.socket_addr).map(|r| {
if let Err(e) = r {
println!("Failed to transfer; error={}", e);
}
});
tokio::spawn(transfer);
}
}
Ok(())
}
pub async fn start_health_checking(&self) {
loop {
match self.health_check_status {
HealthCheckStatus::On => {
let mut servers = self.servers.lock().unwrap();
servers
.retain(|server| std::net::TcpStream::connect(server.socket_addr).is_ok());
}
_ => break,
}
sleep(self.health_check_duration).await;
}
}
it keeps reminding me that I need to impl 'static for self in run function, but I don't want a static, I just want a loop when the variable is avaliable, not after it's dropped, can somebody help me with it? thanks