SonarSource/sonarqube · warning
Broadcasting to listeners failed for %s events
Error message
Broadcasting to listeners failed for %s events
What it means
QGChangeEventListenersImpl.broadcastOnIssueChange forwards quality-gate change events to registered listeners. If the broadcast loop throws a java.lang.Error, it is caught and logged as a warning with the number of events, so listener failures never break issue processing.
Source
Thrown at server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImpl.java:61
public class QGChangeEventListenersImpl implements QGChangeEventListeners {
private static final Logger LOG = LoggerFactory.getLogger(QGChangeEventListenersImpl.class);
private final Set<QGChangeEventListener> listeners;
public QGChangeEventListenersImpl(Set<QGChangeEventListener> listeners) {
this.listeners = listeners;
}
@Override
public void broadcastOnIssueChange(List<DefaultIssue> issues, Collection<QGChangeEvent> changeEvents, boolean fromAlm) {
if (listeners.isEmpty() || issues.isEmpty() || changeEvents.isEmpty()) {
return;
}
try {
broadcastChangeEventsToBranches(issues, changeEvents, fromAlm);
} catch (Error e) {
LOG.warn(format("Broadcasting to listeners failed for %s events", changeEvents.size()), e);
}
}
@Override
public void broadcastOnAnyChange(Collection<QGChangeEvent> changeEvents, boolean fromAlm) {
if (listeners.isEmpty() || changeEvents.isEmpty()) {
return;
}
try {
for (var changeEvent : changeEvents) {
listeners.forEach(listener -> broadcastChangeEventToListener(Set.of(), changeEvent, listener));
}
} catch (Error e) {
LOG.warn(format("Broadcasting to listeners failed for %s events", changeEvents.size()), e);
}
}
View on GitHub (pinned to 184c821202)
Solutions
- Inspect the logged stack trace to find which listener or JVM Error caused the failure.
- Fix or remove the faulty listener plugin causing NoClassDefFoundError/LinkageError.
- If OutOfMemoryError, increase SonarQube JVM heap (SONAR_WEB_JAVAMEMOPT) or reduce batch size.
- Retry the affected issue computation after fixing; events are only lost for this broadcast.
Defensive patterns
Strategy: try-catch
Try / catch
// callers are already protected, but custom listeners should self-guard
try {
listener.onIssueChanges(event, issues);
} catch (Throwable t) {
LOG.warn("QG listener failed", t);
} Prevention
- Keep custom QGChangeEventListener implementations defensive (catch their own exceptions)
- Monitor logs for LinkageError/OOM after SonarQube upgrades
- Ensure listener plugin dependencies do not clash with core classpath
When it happens
Trigger: Any issue change triggering quality-gate events where broadcastChangeEventsToBranches (or a listener's onChange) throws an Error (e.g. NoClassDefFoundError, OutOfMemoryError) rather than a checked/regular Exception.
Common situations: A misbehaving third-party or custom QGChangeEventListener classpath conflict; JVM resource exhaustion during large issue batch processing.
Understand the failure class
Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.
Related errors
- onChange() call failed on listener %s for events %s
- Unsupported value '%s' of Measure.Level can not be converted
- Unsupported value '%s' of Measure.Level can not be converted
- There is no metric with key=%s
- Github configuration is not complete. Please check your conf
AI-assisted analysis of SonarSource/sonarqube@184c821202 (2026-09-09).
Data as JSON: /api/errors/d5a440d6bd5e306e.
Report an issue: GitHub.