Problema
Como detectar se o código está sendo executado no nó mestre em um cluster (se o armazenamento em cluster estiver habilitado).
Solução
Use o descritor de repositório "crx.cluster.master. Mas observe que o valor poderá ser nulo se o armazenamento em cluster estiver desabilitado em algumas versões do CRX. Use o seguinte código (funciona em qualquer aplicativo baseado em CRX usando o CRX2.1.0.10+)
package sample.demo; public interface ClusterService { public boolean isMaster(); }
package sample.demo; import sample.demo.ClusterService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Service; import org.apache.felix.scr.annotations.Reference; import javax.jcr.Repository; @Component(metatype = false) @Service(value = ClusterService.class) public class MyClusterAwareService implements ClusterService { private static final Logger LOGGER = LoggerFactory.getLogger(MyClusterAwareService.class); @Reference private Repository repository; public boolean isMaster() { String v = repository.getDescriptor("crx.cluster.master"); boolean isOnMaster = v == null || Boolean.parseBoolean(v); LOGGER.info("MyClusterAwareService isMaster" + isOnMaster ); return isOnMaster; } @Activate protected void activate() { LOGGER.info("service activated" ); } @Deactivate protected void deactivate() { LOGGER.info ("service deactivated"); } }
<% sample.demo.ClusterService clusterService = sling.getService(sample.demo.ClusterService.class); %> Am I master <%= clusterService.isMaster() %>
Observação: No CQ5, existem algumas bibliotecas para ajudar a implementar serviços OSGi com reconhecimento de cluster.Veja aqui.
** O CRX 2.1 deverá ter o hotfix 2.1.0.10 aplicado
O AEM 5.6.1 (CRX 2.4.30) em diante usa a nova API de topologia. Detalhes em http://helpx.adobe.com/br/cq/kb/create-cluster-aware-osgi-service.html