使用铁框架,如何退出监听循环?
Using iron framework, how to exit the listening loop?
我需要以交互方式查询的大型文本文件周围有一个简单的休息类皮肤。它可能涉及繁重的计算,所以我使用了 Rust。我用 Iron 制作了一个简单的 restful 皮肤。请注意,我对生锈的处理不多。这只是本地主机上的 运行。
pub fn query<'a>(parsed: &'a Parsed, context:&Context) -> {
// parsed.keys is a hash containing config informtion
// context is what I query
let local_port = format!("{}:{}", "localhost", parsed.keys[AS_SERVER]);
fn test_connect<'a>(r: &'a mut Request, c:&'a Context) -> IronResult<Response> {
let url = r.url.to_string();
let result = // some logic
Ok(Response::with((status::Ok, format!("requested=\"{}:{}\"\n", url, result))))
}
let mut router = Router::new();
router.get("*", move |r: &mut Request| test_connect(r, &context));
let connection_status = Iron::new(router).http(&local_port[..]);
connection_status.ok().expect("could not connect");
}
现在我的问题是如何在
的监听循环中控制 return
Iron::new(router).http(&local_port[..]);
我只想说curl http://localhost/done
并退出监听功能,然后进行一些日志记录,然后继续。这可能吗?我试过 panic-ing,但即使那样也不会退出监听循环?
我试过 return 类似 Err(IronError::new(StringError(url),status::ServiceUnavailable))
status::ServiceUnavailable
只是一些随机的东西 - 它需要一些东西:我知道它在语义上不正确,不知道该用什么。但是错误没有任何处理程序,所以它会悄无声息地消失。
我想我会用 aftermiddleware 设置一些东西,但我不知道是什么?
如果一切都失败了,而且没有人能给你更好的答案(换句话说:这应该是最后的选择):std::process::exit
应该以某种方式解决问题。请记住,这只是立即退出进程,因此根本没有完成任何清理工作。
一种方法是在您的处理程序和启动服务器的线程之间设置消息。发送消息时,主线程可以调用Listening::close
在这个例子中,我使用了Condvar
。我希望您也可以使用频道,但无法快速复制和粘贴示例频道并使其正常工作...^_^
extern crate iron;
use iron::prelude::*;
use iron::status;
use std::sync::{Arc, Mutex, Condvar};
fn main() {
// Copied from docs
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();
let handler = move |_: &mut Request| {
// Copied from docs
let &(ref lock, ref cvar) = &*pair2;
let mut should_exit = lock.lock().unwrap();
*should_exit = true;
cvar.notify_one();
Ok(Response::with((status::Ok, "Hello World!")))
};
// Hold onto the listener
let mut serv = Iron::new(handler).http("localhost:3210").unwrap();
println!("Now listening...");
// Copied from docs
let &(ref lock, ref cvar) = &*pair;
let mut should_exit = lock.lock().unwrap();
while !*should_exit {
should_exit = cvar.wait(should_exit).unwrap();
}
serv.close().unwrap();
println!("Exiting...");
}
我需要以交互方式查询的大型文本文件周围有一个简单的休息类皮肤。它可能涉及繁重的计算,所以我使用了 Rust。我用 Iron 制作了一个简单的 restful 皮肤。请注意,我对生锈的处理不多。这只是本地主机上的 运行。
pub fn query<'a>(parsed: &'a Parsed, context:&Context) -> {
// parsed.keys is a hash containing config informtion
// context is what I query
let local_port = format!("{}:{}", "localhost", parsed.keys[AS_SERVER]);
fn test_connect<'a>(r: &'a mut Request, c:&'a Context) -> IronResult<Response> {
let url = r.url.to_string();
let result = // some logic
Ok(Response::with((status::Ok, format!("requested=\"{}:{}\"\n", url, result))))
}
let mut router = Router::new();
router.get("*", move |r: &mut Request| test_connect(r, &context));
let connection_status = Iron::new(router).http(&local_port[..]);
connection_status.ok().expect("could not connect");
}
现在我的问题是如何在
的监听循环中控制 returnIron::new(router).http(&local_port[..]);
我只想说curl http://localhost/done
并退出监听功能,然后进行一些日志记录,然后继续。这可能吗?我试过 panic-ing,但即使那样也不会退出监听循环?
我试过 return 类似 Err(IronError::new(StringError(url),status::ServiceUnavailable))
status::ServiceUnavailable
只是一些随机的东西 - 它需要一些东西:我知道它在语义上不正确,不知道该用什么。但是错误没有任何处理程序,所以它会悄无声息地消失。
我想我会用 aftermiddleware 设置一些东西,但我不知道是什么?
如果一切都失败了,而且没有人能给你更好的答案(换句话说:这应该是最后的选择):std::process::exit
应该以某种方式解决问题。请记住,这只是立即退出进程,因此根本没有完成任何清理工作。
一种方法是在您的处理程序和启动服务器的线程之间设置消息。发送消息时,主线程可以调用Listening::close
在这个例子中,我使用了Condvar
。我希望您也可以使用频道,但无法快速复制和粘贴示例频道并使其正常工作...^_^
extern crate iron;
use iron::prelude::*;
use iron::status;
use std::sync::{Arc, Mutex, Condvar};
fn main() {
// Copied from docs
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();
let handler = move |_: &mut Request| {
// Copied from docs
let &(ref lock, ref cvar) = &*pair2;
let mut should_exit = lock.lock().unwrap();
*should_exit = true;
cvar.notify_one();
Ok(Response::with((status::Ok, "Hello World!")))
};
// Hold onto the listener
let mut serv = Iron::new(handler).http("localhost:3210").unwrap();
println!("Now listening...");
// Copied from docs
let &(ref lock, ref cvar) = &*pair;
let mut should_exit = lock.lock().unwrap();
while !*should_exit {
should_exit = cvar.wait(should_exit).unwrap();
}
serv.close().unwrap();
println!("Exiting...");
}