2014-02-06 68 views
1

我正在尋找一個接受作業請求,然後將這些請求發送到另一個web服務(第三方服務讓我們稱之爲B)的Java實現Web服務(讓我們稱之爲A)。沒有什麼複雜的。從B到A的響應是同步的(返回作業ID),然後當作業完成時,B向A發送異步消息,通知作業已完成(作業到B可能需要X時間)。 B一次只能接受20個工作,但A應該能夠接受來自多個客戶的儘可能多的工作。所以A需要一個排隊系統,以便只發送B不超過20個工作。當B完成工作並通知A時,則A可以將另一項工作發送給B.使用web服務排隊作業的框架

我可以在狀態爲NEW的數據庫中保存進入A的工作,然後每5分鐘運行一次流程,收集新的工作,如果<由B發送作業處理的20個作業。由B處理的作業將具有狀態PROCESSING,然後當B將作業完成發送給A時,它將狀態設置爲DONE。只是

我可以使用JMS或像駱駝這樣的路由引擎來做到這一點,或者任何人都可以提供另一個框架來幫助。我一直無法找到維護隊列的任何內容,只能發送最多X個作業。 A隊列可能有數百個等待處理的作業,但只有在完成另一個作業時纔會向B發送另一個作業。

回答

0

你可以用駱駝做得很完美。對我來說最簡單的方法是:添加一個JMS隊列,接受來自A的呼叫並將它們添加到隊列中(路由1)。添加一個20個消費者的JMS監聽器,將任務發送給B(路由2),並將B的響應添加到A後面

1

只要您的任務如此特殊,我不確定是否有「開箱即用」解決方案在任何框架。

你是對的:排隊是給你的。在這種情況下,我不確定併發消費者是否可以,因爲您需要「屏障」。

作爲「屏障」的解決方案我sugggest有一些AtomicInteger,當你發送作業增加它和值發送給一些分量停止你的消費者,如果「屏障」是上限值。

當工作完成時,您減少AtomicInteger開始消費者,如果'障礙'小於這個限制。

不確定,如果Camel允許啓動/停止端點,但Spring Integration依賴於消息端點的Lifecycle

1

除非您需要持續處理尚未提交處理的作業,否則我認爲您需要的只是兩個blocking queues

  1. 傳入作業隊列(「大」容量)
  2. 工作完成隊列(20最大容量)

您的網絡線填補「進入作業隊列」與新的工作崗位待定。單個工作線程一次從該隊列中取出作業。然後嘗試將一個標記元素放入「作業掛起完成隊列」中。如果該隊列中的條目少於20個,它將立即成功並隨後將作業提交給您的服務B.

接收來自B的異步回調的線程將從「待處理的作業完成隊列「。 如果隊列中已有20個條目,則嘗試提交新作業的線程會被阻止,直到回調線程刪除令牌元素。

+0

持久性可能需要查看處理後的作業歷史記錄,如果服務器關閉,它需要恢復先前排隊的任何作業,這就是爲什麼我認爲JMS將是最佳選擇。我可能需要能夠從隊列中刪除作業(取消未處理的作業)。我會嘗試你的建議 – monty