我有一点代码,创建一个salix web应用程序,并通过使用util::Webserver从IDE弹出式菜单运行它。为了允许命令多次使用,我尝试先关闭该地址的任何现有web服务器,但它似乎不工作。无论如何,它总是会出现一个非法参数错误,声明"shutdown"不可能的。
void run_game(Tree t, loc s){
t = annotate(t);
PSGAME g = ps_implode(t);
Checker c = check_game(g);
Engine engine = compile(c);
loc host = |http://localhost:9050/|;
try { util::Webserver::shutdown(host);} catch: ;
util::Webserver::serve(host, load_app(engine)().callback, asDaemon = true);
println("Serving content at <host>");
}
我期望发生的是,这个函数第一次运行时,shutdown
抛出一个错误,因为没有web服务器存在,然后serve
启动web服务器。如果用户再次尝试运行该功能,则shutdown
成功运行,清除地址绑定并且serve
成功绑定到该地址。
实际上第二次发生的是,shutdown
仍然错误,错误被沉默,然后serve
抱怨地址已经被使用了。
我正在寻找任何解决方案,让我通过IDE的弹出式菜单(以前注册)在同一地址启动一个salix应用程序。
PS_contributions =
{
PS_style,
popup(
menu(
"PuzzleScript",
[
action("Run Game", run_game)
]
)
)
};
registerContributions(PS_NAME, PS_contributions);
右;我们遇到了类似的问题,并决定在运行web应用程序时采取特殊的行动。所以我们添加了这个:
data Menu = interaction(str label, Content ((&T <: Tree) tree, loc selection) server)
看到https://github.com/usethesource/rascal-eclipse/blob/bb70b0f6e8fa6f8c227e117f9d3567a0c2599a54/rascal-eclipse/src/org/rascalmpl/eclipse/library/util/IDE.rsc L119
Content
来自Content
模块,它基本上包装了任何Response(Request)
servlet。
所以你可以包装你的salix webApp在一个Content
和返回它给定当前选择和当前树。
IDE将负责启动和关闭服务器。每次创建与相同标签的交互时,或者在给定的HTTP端口上静默30分钟后,它都会执行此操作。