Problema
Come rilevare se il codice è in esecuzione sul nodo master in un cluster (se il clustering è abilitato).
Soluzione
Utilizza il descrittore del repository "crx.cluster master. Ma nota che il valore potrebbe essere nullo se il clustering è disabilitato su alcune versioni di CRX. Usa il seguente codice (funziona in qualsiasi applicazione basata su CRX utilizzando 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() %>
Nota: In CQ5 ci sono alcune librerie che aiutano ad implementare servizi OSGi consapevoli dei cluster.Vedi qui.
** CRX 2.1 deve avere hot fix 2.1.0.10 applicato
AEM 5.6.1 (CRX 2.4.30) utilizza la nuova topologia API. Dettagli su http://helpx.adobe.com/it/cq/kb/create-cluster-aware-osgi-service.html