我正在重構一個GWT應用程序和管道在Guice刪除一些在我們的web.xml中開發的cruft。我使用guice來映射由GWT客戶端代碼調用的RPC服務。粗略地遵循這裏概述的方法。 http://stuffthathappens.com/blog/2009/09/14/guice-with-gwt/GWT,Guice ServletModule和GWT RPC問題與servlet.init()
該方法需要遠離擴展RemoteServiceServlet,但也意味着我不再能夠訪問通常通過ServletApi提供的init(),shutdown()和destroy()方法。
對於我們開發的大多數服務來說,這並不是問題,但有一種情況我偶然發現我們服務中的代碼片段依賴於使用init()來創建一個傳入引用的對象到servlet並啓動一個線程,該線程調用servlet類中的方法來輪詢服務並維護可供GWT服務使用的緩存。請參閱下面的代碼(爲了清晰起見縮短)
public class MyServiceImpl extends RemoteServiceServlet implements MyService{
private CacheRefresh cr = null;
public void init(ServletConfig servletConfig){
super.init(servletConfig);
cr = new CachRefresh(servletContext, this) ;
cr.start();
}
public String someMethod(){ .. }
}
public class CacheRefresh extends Thread{
public CacheRefresh(ServletContext context, MyServiceImpl servlet){
...
}
public void run(){
context.setAttribute("A_MAP_KEY", servlet.someMethod())
}
}
我明白,以這種方式使用線程也可能不是一個好主意。這是我繼承的代碼,我會在適當的時候繞過去做更好的事情。
有沒有人有如何解決這個好主意?我能想到的唯一選擇是保留它,並通過web.xml文件中的映射進行配置。我不喜歡這樣的想法:在大量的地方進行配置,像散落的灰塵一樣散落在周圍。
歡迎任何建議。
編輯 - 我們使用的吉斯2.0