2009-10-14 115 views
2

我不能完全肯定在這裏問什麼問題,因爲我不知道的詞彙......Tomcat中的有狀態進程(守護進程?)?

的Tomcat的servlet(以及與此有關的任何服務器)很好地工作,如果他們是無狀態的,快速響應請求,狀態存儲在數據庫中。似乎如果我有長時間運行的操作,那麼也許我想在後臺運行一些其他服務,並讓Tomcat處理程序與它進行通信。有沒有辦法在與Tomcat相同的JVM中運行長時間運行的Java應用程序,並通過「常規」Tomcat servlet與它進行交互?


例子:比方說,我想提供的HTTP REST風格的數字分解服務。

這裏是一個可能的方案(我希望我有HTTP語法正確,我忽略大多數頭):

# comments start with #, > = request, < = response 
# 
# first we create a queue 
> POST /factorizer/create-queue 
> {information here} 
< queue=12345B 
# then we post some numbers to it 
> POST /factorizer/queue/12345B 
> 123 
> 456 
> 678 
> 123456789
< OK 
# let's look at the status 
> GET /factorizer/queue/12345B/status 
< requested=4 
< processed=3 
# query 
> GET /factorizer/queue/12345B/7 
< Error: invalid index 
> GET /factorizer/queue/12345B/3 
< Error: not complete 
> GET /factorizer/queue/12345B/0 
< 123=3*41 
# wait a while 
> GET /factorizer/queue/12345B/status 
< requested=4 
< processed=4 
> GET /factorizer/queue/12345B/3 
< 123456789=3*3*3*7*13*31*37*211*241*2161*3607*3803*2906161 

我能想到的是如何寫的servlet來處理查詢,但我怎麼能在同一個JVM中實現一個守護進程/獨立運行的服務?

編輯:在上面的例子中,我想要做的是讓一個後臺應用程序自動運行,包含工作隊列,以考慮質數,並且有一個Java接口,支持Tomcat servlets可以用來將服務公開給網絡。然後,我不擔心我的後臺程序的Web界面或HTTP,我不擔心我的servlet的多線程問題或質數分解。

+0

所有的servlet都在同一個web應用程序中嗎? – 2009-10-14 21:54:52

+0

是的。 (只是好奇:什麼會改變,如果我說沒有,但他們是在同一個JVM所有的Tomcat的servlet?) – 2009-10-14 22:08:53

+0

如果我沒有記錯,在同一個JVM的Tomcat應用相互隔離。而不是Tomcat,你需要像JBoss那樣的Enterprise Java Beans。或者,您可以將許多servlet放入單個Tomcat應用程序中,並可以互相看到。 – 2009-10-16 01:32:17

回答

1

如果你不絕對需要在同一個JVM(也就是說,如果你不需要直接訪問對象的性能),你可以寫另一個Tomcat應用程序,讓你的其他應用程序通過與它通信HTTP到本地主機。實際上你會寫一個恰好在同一臺機器上運行的Web服務。 (我不知道多個Tomcat應用程序是怎麼回事可以看到對方,這是一個問題,即企業Java Beans解決了,但可能是太重量級的解決方案適合您。)

如果你只有一個Tomcat應用程序需要這樣做,創建一個工作線程並將其放入所有請求都可以與之通信的應用程序上下文中。

關於你的具體問題,它看起來像你所描述的東西就像在O'Reilly的「RESTful Web服務」一書的異步工作模式。這使用「202 Accepted」狀態代碼來指示處理未完成。請參閱本書第8章中的「異步操作」。

http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260/ref=sr_1_1?ie=UTF8&s=books&qid=1255555328&sr=8-1

+0

「應用程序上下文」?有沒有這個教程?我熟悉工作線程知道如何處理大多數的多線程/併發方面。 – 2009-10-14 21:31:06

+0

您的servlet擴展了HttpServlet。 HttpServlet.getServletContext()返回所有請求看到的ServletContext(或「應用程序範圍」)。 ServletContext.setAttribute(String name,Object value)和ServletContext.getAttribute(String name)讓你放置任何你想要的東西。Java Server Pages教程可能對此有最多的證明。 – 2009-10-14 21:40:59

+0

哦,整齊。這聽起來像我想要的。謝謝! – 2009-10-14 22:07:37