2012-03-03 62 views
0

我已經制定了以下程序/結構:如何獨立處理來自Servlet的數據?

A)的Java servlet接收POST請求,得到從POST請求,並將它們的參數在一個公共的靜態鏈表:

public static LinkedList incomingQueue = new LinkedList<myObjects>(); 

也就是說,每一個POST請求我這樣做:

incomingQueue.push(myObject); 

現在,我要定期訪問隊列,並在對象上執行處理:

while(true){ 
doProcessing(incomingQueue); 
wait(someTime); 
} 

顯然,我沒有一個主要的課程來做到這一點。如何創建這樣的類,該類可以訪問由servlet觸發的incomingQueue 而不是?什麼是正確的架構來做到這一點?

謝謝你的時間。

+0

忽略您使用非同步LinkedList對併發訪問不安全的事實,您需要創建一個在後臺運行並處理該事件的線程。 – 2012-03-03 14:15:22

回答

0

所有隊列首先應放置在servlet上下文屬性(參見:ServletContext.setAttribute()也獲得了該隊列必須是同步的,考慮ArrayBlockingQueue

在平原的servlet可以使用ServletContextListenercontextInitialized()啓動一個線程。並中斷其在contextDestroyed

如果您正在使用可以使用@Scheduled annotation,在:。TimerService@Schedule

最後在標準Java中有一個Timer類。最後但並非最不重要的,看看,它可能是一個更好的選擇在你的情況。

0

您有幾種選擇:

  1. 使用調度庫像Quartz
  2. 如果你不希望使用一個單獨的庫,你應該添加一個監聽器到你的web.xml擴展ServletContextListener和啓動單獨線程contextInitialized()

另請參見:@BrianRoach。關於同步列表的觀點相當重要。

0

您需要同步您的方法進行併發訪問。

一個非常硬核的解決方案就是像生產者和消費者一樣實施它。 Here是一個使用堆棧和1個生產者和3個消費者的示例。

更簡潔的解決方案是使用JMS

相關問題