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

  1. Inspect the logged stack trace to find which listener or JVM Error caused the failure.
  2. Fix or remove the faulty listener plugin causing NoClassDefFoundError/LinkageError.
  3. If OutOfMemoryError, increase SonarQube JVM heap (SONAR_WEB_JAVAMEMOPT) or reduce batch size.
  4. 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

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


AI-assisted analysis of SonarSource/sonarqube@184c821202 (2026-09-09). Data as JSON: /api/errors/d5a440d6bd5e306e. Report an issue: GitHub.