Problem
Sie sehen den folgenden Fehler in der Datei logs/crx/error.log:
*WARN * ObservationDispatcher: Mehr als 200000 Ereignisse in der Warteschlange
Oder das System ist beim Datenimport langsam.
Lösung
Gehen Sie wie folgt vor, um das Problem zu analysieren:
- Erstellen Sie ein „EventConsumer“, das Ihnen die Dauer der Ausführung jedes JCR ermöglicht.
- Reproduzieren Sie das Problem und nehmen Sie Themenbereiche und führen Sie den Profiler aus, um Details darüber zu sammeln, welcher Code oder Inhalt das Problem verursacht.
- Ändern Sie den Code, um das Problem zu beheben. Bereinigen Sie den Inhalt, der das Problem verursacht oder wenden Sie sich an den AEM (CQ)-Support, wenn das Problem mit dem Produktcode zu tun zu haben scheint.
1. Erstellen Sie ein EventConsumer-Debugprotokoll
In CQ5.4/CRX2.2 oder früher:
- Beenden Sie CQ.
- Legen Sie die folgende Protokollstufe in der Datei crx-quickstart/server/runtime/0/_crx/WEB-INF/log4j.xml <logger name="org.apache.jackrabbit.core.observation.EventConsumer">
<level value="debug" />
</logger> fest - Starten Sie CQ.
- Nun sehen Sie unter logs/crx/error.log Debug-Protokollnachrichten von org.apache.jackrabbit.core.observation.EventConsumer, die die Ausführungszeit für jedes Ereignis anzeigen.
- Gehen Sie auf http://host:port/system/console/configMgr und melden Sie sich als Administator an.
- Suchen Sie die Apache Sling Logging Logger-Factory und erstellen Sie eine Instanz, indem Sie auf die Schaltfläche „+“ auf der rechten Seite der Werkskonfiguration klicken. In diesem Schritt wird eine neue Protokolleinrichtung erstellt.
- Stellen Sie die Konfiguration auf folgende Einstellungen ein:
Protokollebene: DEBUG
Dateipfad des Protokolls: logs/eventconsumer.log
Kategorien: org.apache.jackrabbit.core.observation.EventConsumer - Jetzt können Sie in logs/eventconsumer.log Debug-Protokollmeldungen von org.apache.jackrabbit.core.observation.EventConsumer sehen, die die Ausführungszeit für jeden Ereignis-Handler zeigen.
2. Das Problem reproduzieren
Reproduzieren Sie das Problem mit Ihrer nun erstellten DEBUG-Protokolldatei, indem Sie noch einmal jegliche Aktivität versuchen, die dazu geführt haben könnte, dass die Ereignisse sich anhäufen. Nun Thread-Zwischenspeicher nehmen und den CPU-Profiler ausführen. Dies kann dabei helfen, die Ursache der Langsamkeit zu identifizieren.
3. Ändern des Codes, um das Problem zu beheben
Sie haben DEBUG-Protokolle, Thread-Zwischenspeicher und Ausgaben vom CPU-Profiler gesammelt, sodass Sie jetzt genügend Informationen haben, um auf eine zugrundeliegende Ursache schließen zu können. Unter [2] unten finden Sie Beispielsprotokollnachrichten, die einen lange laufenden JCR EventListener/EventConsumer zeigen.
Je nach Ergebnissen könnten Sie eines der folgenden sehen:
- Ein Fehler in einem benutzerdefinierten JCR EventListener - um das Problem zu lösen, optimieren Sie Ihren Code.
- Eine große Anhäufung von Inhalten führt dazu, dass ein benutzerdefinierter oder JCR EventListener langsam ausgeführt wird.
Um das Problem zu beheben, löschen Sie den verwandten Inhalt, den Sie nicht mehr benötigen:
1. Gehen Sie zu CRX Explorer: http://host:port/crx/explorer/index.jsp (/crx/index.jsp in CQ 5.4 und älteren Versionen)
2. Öffnen Sie „Content Explorer“ und navigieren Sie zum Inhaltspfad, den Sie bereinigen möchten.
3. Klicken Sie mit der rechten Maustaste auf den Knoten oben in der Struktur, die Sie löschen möchten, und wählen Sie „Rekursiv löschen“
4. Deaktivieren Sie den vorläufigen Scan und starten Sie - Ein Problem mit einem Out-of-the-Box-JCR-Ereignis-Listener - steht dem AEM (CQ)-Dienst zur Verfügung.
07.04.2010 11:05:24 *WARN * ObservationDispatcher: More than 200000 events in the queue (ObservationDispatcher.java, line 228) java.lang.Exception: Stack Trace at org.apache.jackrabbit.core.observation.ObservationDispatcher.dispatchEvents(ObservationDispatcher.java:228) at org.apache.jackrabbit.core.observation.EventStateCollection.dispatch(EventStateCollection.java:465) at org.apache.jackrabbit.core.state.SharedItemStateManager$Update.end(SharedItemStateManager.java:763) at org.apache.jackrabbit.core.state.SharedItemStateManager.update(SharedItemStateManager.java:1109) at org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:351) at org.apache.jackrabbit.core.state.XAItemStateManager.update(XAItemStateManager.java:354) at org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:326) at org.apache.jackrabbit.core.state.SessionItemStateManager.update(SessionItemStateManager.java:331) at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1124) at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:919) at com.day.jcr.vault.fs.io.AutoSave.save(AutoSave.java:114) at com.day.jcr.vault.fs.io.Importer.commit(Importer.java:677)
25.11.2013 00:00:11.115 *DEBUG* [ObservationManager] org.apache.jackrabbit.core.observation.EventConsumer listener com.day.cq.rewriter.linkchecker.impl.LinkInfoStorageImpl processed events in 15250 ms. 25.11.2013 00:01:26.859 *DEBUG* [ObservationManager] org.apache.jackrabbit.core.observation.EventConsumer listener com.day.cq.rewriter.linkchecker.impl.LinkInfoStorageImpl processed events in 74077 ms. 25.11.2013 00:02:30.569 *DEBUG* [ObservationManager] org.apache.jackrabbit.core.observation.EventConsumer listener com.day.cq.rewriter.linkchecker.impl.LinkInfoStorageImpl processed events in 49786 ms.
Weitere Informationen
Der Fehler ist in der Regel auf ein Problem mit den JCR-Ereignis-Listenern zurückzuführen. Ein bestimmter JCR-Ereignislistener könnte Ereignisse falsch behandeln oder sie aus irgendeinem Grund zu langsam verarbeiten.
Siehe hier für einige Hintergrundinformationen über JCR Event Listener.