1

我正在使用 Restlet、GAE 和 Eclipse 开发一个应用程序。好的,我得到了这个:

公共类 MainRestletApplication 扩展应用程序 {

public MainRestletApplication()
{
//init code?
} 


@Override
public Restlet createInboundRoot() {
    Router router = new Router(getContext());

    router.attach("/v1/mainstatus",MainStatus.class);
    router.attach("/v1/game/{id}/result",GameResult.class);

    return router;
}

}

和这个:

<servlet>
    <servlet-name>RestletServlet</servlet-name>
    <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
    <init-param>
        <param-name>org.restlet.application</param-name>
        <param-value>com.example.MainRestletApplication
        </param-value>
    </init-param>
</servlet>

<!-- Catch all requests -->
<servlet-mapping>
    <servlet-name>RestletServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

好吧,我可以在哪里放置一个方法来初始化 Web 服务,ergo,一些代码仅在应用程序启动时(一次)初始化一些数据,而不是在第一次调用时。

谢谢

4

2 回答 2

2

无论您是否使用 Restlet,AppEngine 与否,您都可以在 web.xml 中的任何 servlet 环境中设置上下文侦听器,如下所示:

<listener>
    <listener-class>
        example.ServletContextExample
    </listener-class>
</listener>

并执行此操作;

public class ServletContextExample implements ServletContextListener{
    ServletContext context;
    public void contextInitialized(ServletContextEvent contextEvent) {
        System.out.println("Context Created");
        context = contextEvent.getServletContext();
        // set variable to servlet context
        context.setAttribute("TEST", "TEST_VALUE");
    }
    public void contextDestroyed(ServletContextEvent contextEvent) {
        context = contextEvent.getServletContext();
        System.out.println("Context Destroyed");
    }
}

当您在 GAE 上的实例启动时,将在处理调用之前执行初始化代码;另一方面,很可能会启动一个新实例,因为必须处理一个调用。鸡和蛋的故事……

于 2012-12-04T17:43:25.003 回答
0

为此,您可以覆盖 com.example.MainRestletApplication 类的 start() 方法。它的生命周期与包装器 RestletServlet 同步。

于 2012-12-10T08:29:53.103 回答