2010-10-06 46 views
3

我知道'普通'Java,但對servlet,容器等領域來說是新手。因此,我不確定哪種方法最明智。對非servlet應用程序使用Servlet

情況:我創建了一個接收信息並將其存儲在數據庫中的Servlet。該數據庫被其他應用程序讀取。

現在我需要的是一個應用程序接收完全相同的信息並將其存儲在同一個數據庫中。然而,這個新的應用程序需要從另一個服務器(我將使用httpClient)來獲取這些信息,而不是將它推送到它。這兩個應用程序將共存。

對於這個新的應用我看到以下兩個選項:

  1. 做一個獨立的應用程序。爲此,我可以複製粘貼很多現有的後端代碼,但是我需要做一些修改(servlet容器提供了一個上下文,簡單的數據庫連接池等)。另外,我可能需要使用一些包裝器,這樣可以像我可以啓動的適當的守護進程一樣工作,但也可以優雅地停止/重啓等。

  2. 使新的應用程序成爲Servlet的一部分。也就是說:只需在運行新應用程序的servlet的init()中啓動一個新線程即可。這將允許我重新使用已有的所有後端代碼,而無需重寫任何代碼。我只需要將執行HTTP-GET請求的代碼寫入其他服務器。使用這種方法,啓動和停止服務也會更容易,因爲我可以使用Servlet容器。

有關項目的一些信息:將數據解析並寫入數據庫的後端代碼有幾個線程,但並不十分複雜。編寫原始servlet的代碼大約需要一週的時間。使用現有的代碼庫我覺得這個新的應用程序應該最多可以工作1,2天。

我看到選項2的方式比較容易。但感覺有點像我會'濫用'servlets。 所以我的問題是:應該處理請求的應用程序不是servlet,而不是請求的應用程序?我在這裏沒有看到一些巨大的缺點嗎?哪個選項最有意義?

tl; dr:我可以編寫一個不作爲Servlet提供請求的應用程序嗎?

回答

3

Servlet容器是線程管理的環境。一般來說,不要在servlet中啓動自己的線程,否則可能會發生壞事......例如啓動和停止應用程序上下文 - 應用程序服務器不知道您可能啓動的線程,因此不會停止他們與你的應用程序...(更多詳細信息在this SO question

我會嘗試從servlet中提取我需要的邏輯到不依賴於Servlet API的類,並重新設計servlet以使用這些類。 (重構)。正如你注意到的,servlet API全部是關於接收請求和發送響應的。

我可以在我喜歡的任何地方重新使用我的新非servlet類中的邏輯,其中包括輪詢抽出該信息的應用程序的非servlet部分。

+0

後續問題:我不應該開始我自己的線程,否則會發生不好的事情。你能詳細解釋一下嗎? 現在,現有的servlet使用兩個後臺線程將數據寫入兩個數據庫。 這些線程使用BlockingQueue連接到servlet。我在不同線程中擁有這個功能的原因是因爲寫入數據庫需要大量時間(因爲數據庫中有很多觸發器)並且數據可能會以突發形式進入。 所以這不是一個adviced設計?這給了什麼樣的麻煩? – brasilt 2010-10-06 14:01:09

+0

對不起,我正在更新您的評論。 – Brabster 2010-10-06 14:05:14

+0

@Brabster所指的可能是事實,大多數的Web /應用服務器喜歡在servlet容器管理線程,理論上你自己發起的線程不是安全的,因爲如果你需要的容器可以與他們胡鬧.... – 2010-10-06 14:05:58

6

請勿複製並粘貼代碼。

編寫一個可重用的類/模塊,用於處理將數據存儲在數據庫中的信息,該信息可以被1)servlet和2)從HttpClient檢索信息的獨立代碼使用。

這種方式,同一塊代碼處理相同的邏輯 - 如何存儲在數據庫中的信息 - 所討論的信息是否被推動到一個servlet或正在從遠程URL獲取。

0

你可以使用,但你不應該,這是一個非常糟糕的設計。

  • 一類是做所有的工作與數據庫等:

    如果您有兩種不同的方式來訪問你的應用程序(一個通過servlet和其他作爲獨立的),你應該在leats三類創建調用一流

  • 一個獨立的類(或其他)調用一流

這樣

  • 一個servlet的,你不要複製/粘貼,和你可重用代碼(甚至你可以有第三種方式來調用做重活

  • 0

    如果你想重用代碼,這個代碼爲「服務」或「商業邏輯」層的一部分,將在類被你的servlet和非servlet應用程序使用。

    包中的代碼,一個罐子,並用它在這兩個應用程序。