2013-08-31 130 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不会自动将数字附加到同名页面吗?

如果没有,那么大概这会失败,在这一点上,你重新开始下一个数字。在这种情况下,最好的猜测应该足够了。