Problem
Ermitteln ob der Code auf dem Masterknoten in einem Cluster ausgeführt wird (wenn Clustering aktiviert ist).
Lösung
Verwenden Sie den Repository-Deskriptor „crx.cluster.master“. Beachten Sie jedoch, dass der Wert null sein könnte, wenn das Clustering für einige Versionen von CRX deaktiviert ist. Verwenden Sie den folgenden Code (funktioniert in jeder CRX-basierten App mit CRX 2.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() %>
Hinweis: In CQ5 gibt es einige Bibliotheken, welche mit der Implementierung von clusterabhängigen OSGi-Diensten helfen.Siehe hier.
** CRX 2.1 muss Hotfix 2.1.0.10 angewendet haben.
Ab Version AEM 5.6.1 (CRX 2.4.30) wird eine neue Topologie-API verwendet. Details unter https://helpx.adobe.com/de/cq/kb/create-cluster-aware-osgi-service.html
Bei Ihrem Konto anmelden