2013-08-31 129 views
2

我有要求以編程方式創建CQ頁面的要求。但挑戰在於頁面名稱/ uri應該是自動生成的字符串+唯一編號(例如PT2000,PT2001)的組合。在CQ中生成自動增量唯一編號的策略

有人可以告訴我一種方式來生成CQ中的autoincrement-id /常量,即使有多個併發請求,id也是唯一的嗎?

回答

0

使用一種服務,該服務爲您提供了ID,並管理易失性實例變量中的計數器,以確保一個線程的狀態更改會立即傳送到所有其他線程。

只要您能保證您的實現在單個作者節點上運行,就應該這樣做。在集羣場景中,您還必須關心只在一個節點上執行它。

+0

正如您所說,集羣中的這種情況需要特殊處理。有沒有辦法確保被調用的http端點只在master中執行(通過一些http參數或者什麼)?我在想這種方式,從節點可以調用主節點,這可以是創建此唯一標識的單點。 – Shan25

+0

在集羣方案中,通常使用前面的負載平衡器來在編輯節點之間傳播負載。 因此,這將是我會確保任何種類的具有特定參數的發佈請求都會發送給主人的地方。有其他網關代理或網絡服務器的其他人也可以這樣做。 – Thomas

0

我會建議創建一個服務來管理其在倉庫中某處的計數器,並且還充當jcr EventListener。該服務應該監聽cq:Page類型的父節點上的NODE_ADDED事件,並且一旦onEvent被調用,它就可以在該點分配唯一的id。你會想明顯地使用同步,以便重複調用onEvent()不會使用相同的ID。

+0

我喜歡將計數器保存在存儲庫中的想法。但是,偵聽Node_Added的id生成器服務聽起來像uniqueId只能在創建Page後創建,而我的用例是需要使用頁面名稱/ uri作爲uniqueId創建頁面。 – Shan25

+0

@ Shan25你找到了解決方案嗎?那麼創建一個服務來創建一個節點並在那個時候分配一個uid屬性,然後把節點返回給調用者呢? –

0

AEM不會自動將數字附加到同名頁面嗎?

如果沒有,那麼大概這會失敗,在這一點上,你重新開始下一個數字。在這種情況下,最好的猜測應該足夠了。