2012-10-23 32 views
1

我有以下問題需要解決。單個java進程的排隊/工作線程體系結構

我需要寫一個java程序:

  1. 讀取JSON對象J1,J2,...,JN從web服務。
  2. 對每個對象都進行一些處理以獲得j1',j2',...,jn'
  3. 將對象j1',j2',...,jn'發送到Web服務。

步驟1,2和3的計算空間要求可以在任何給定時間變化。

例如:

  1. 它需要在步驟2處理JSON對象可以根據JSON對象的內容而變化的時間。
  2. 第1步中由webservice生成的對象的速率可隨着時間上升或下降。
  3. 步驟3中的使用Web服務可能會積壓。

爲了解決上述方面的設計要求要實現以下結構:

enter image description here

    從外部Web服務
  1. 閱讀JSON對象並將其放置在Q
  2. 自動大小調節工作者線程池,它使用Q中的JSON對象並處理它們。處理它們之後,將結果對象放在第二個Q上自動調整大小的工作線程池,該線程池使用來自第二個Q的JSON對象將它們發送到使用Web服務。

問:

我很好奇,如果有框架,我可以用它來解決這個問題?

注:

  1. 我可以在此使用範圍,如自定義隊列組件的解決,線程池使用併發包 - 但是我正在尋找一個解決方案,允許這樣的解決方案的寫作。
  2. 這不會生活在一個容器內。這將是一個Java過程,入口點是公共靜態無效的主要(字符串參數[])
  3. 但是,如果有一個容器適合這種範式,我想了解它。
  4. 我可以把它分成多個進程,但是我想在一個進程中保持它非常簡單。

感謝。

謝謝。

+1

問題是? – home

+0

對不起......這一定是我累了的大腦。 – user1172468

+0

np,感謝您的更新! – home

回答

1

嘗試Apache camelSpring Integration來連線。這些是一種集成框架,將減輕您與web服務的交互。你需要做的是從Web服務定義路線 1 - >算術達 - > Web服務2.路由之間可以通過框架本身

處理你實現你排排坐般地在所需的轉換處理器。 並行您的cruncher可能通過SEDA;駱駝有一個組件this pattern。另一種替代方案是AsyncProcessor

我想說你首先看看像駱駝這樣的框架背後的原理。他們創建的抽象與手頭的問題非常相關。

+0

嗯,@ mzzzzb,你認爲Twitter風暴會適合這個賬單嗎? – user1172468

+0

@ user1172468,我害怕我不知道Storm的事情。只是看着它,似乎很有趣,而不是建議。還有一件事要學習:) – mzzzzb

1

我不完全確定您的帖子最終的問題是什麼,但您有合理的設計理念。我給你的一個問題是你在什麼環境?你在JavaEE容器中還是僅僅是一個簡單的獨立應用程序?

如果您位於容器中,那麼使消息驅動Bean離開JMS隊列處理比擁有工作線程池更有意義。

如果在您自己的容器中,自己管理線程池會更有意義。有了這個說法,我還會考慮讓單獨的應用程序運行,從隊列中取出工作,這將爲您帶來更好的縮放體系結構。如果需求出現了,你可以添加更多的機器和更多的工作人員指向一個隊列。

+0

非常感謝@Jeff我會根據您的輸入編輯問題並對其進行優化,但基本上如下: 1.無容器2.要保持簡單:單一過程 – user1172468

+1

據我所知,沒有任何一站式商店框架,但你可以鏈接在一起。您可以使用諸如[Apache Axis](http://axis.apache.org/axis/)之類的框架來消費和推送到Web服務和[Apache Commons Pooling](http://commons.apache.org/)池/)爲線程池和自動增長。 –