2010-05-17 97 views
1

我正在重構一段代碼atm,其中一個長時間的服務操作在servlet中執行。現在有時我在手術完成後沒有得到任何迴應。 (它已經完成,因爲它被打印到日誌中)Servlets,長時間操作

我希望實現的是servlet的一些「火和遺忘」行爲。我會通過我的params的行動和servlet會立即返回一個狀態(如:操作已開始,查看您的日誌的更多信息)

這是可能的servlet 2.5規範?我想我可以通過JMS獲得這樣的行爲,也許有其他解決方案嗎?

回答

1

您應該考慮使用Java的ExecutorService抽象(Executor/Future框架),而不是開始(並管理)自己的腳步。如果您使用的是Spring,您可以在Spring的上下文中將Executor定義爲另一個bean,並且您的servlet可以將其稱爲傳遞任務作爲Runnable的實例。如果你使用Google,應該有大量的樣本。

3

異步Servlets可以滿足您的需求,但它僅作爲Servlet 3.0規範的一部分提供。您可以閱讀更多關於異步Servlets的信息here

1

如果升級到Servlet 3.0(Java EE 6的一部分,Glassfish v3作爲唯一的實現; Tomcat 7仍然在運行中,並且預計在下個月發佈)不是選項,那麼替代方案是Comet。幾乎所有的Java servlet容器都有這方面的功能。目前還不清楚你正在使用哪一個,所以這是一個Tomcat 6目標文件:What is the Apache Tomcat Comet API

或者,您可以在servlet中單獨啓用Thread,以便servlet方法可以直接返回。您最終可以將Thread存儲在會話中,以便狀態可以保留在隨後的請求中。如果需要的話,讓它實現HttpSessionBindingListener,以便您可以在會話過期時中斷它。

2

有幾種方法可以做到這一點。異步servlet是Servlet api 3.0的一部分。我知道很多人會從一個單獨的線程中啓動,通常是一個守護進程線程。產生自己線程的缺點是你失去了你可能擁有的任何「容器」優勢,因爲線程在JVM中或多或少地獨立運行。我最經常使用的是由JMS提供的消息驅動bean,它運行在EJB容器中,具有所有伴隨的優點和缺點。因人而異。