Skip to content

Исследовать шум EventPublisherAspect: сотни предупреждений о недоставленных событиях в логе сборки #4335

Description

@nixel2007

Что видно

В логе успешной сборки — 175 одинаковых предупреждений подряд:

WARN c.g._.b.l.aop.EventPublisherAspect : Failed to publish event
  DocumentContextContentChangedEvent[source=DocumentContext@5f77806f]
  to context AnnotationConfigApplicationContext@25e16307:
  java.lang.NullPointerException: Cannot invoke
  "LanguageServerConfiguration.getLanguage()" because the return value of
  "ServerContext.getLanguageServerConfiguration()" is null

Стек падения (виден в логе отдельно): ServerContext.computeConfigurationMetadataLazy.getOrComputeServerContext.getConfiguration.

Пример: сборка PR #4330, задание build (25, ubuntu-latest).

Почему так происходит

EventPublisherAspect.publishEvent сперва пробует найти контекст-владелец события, а не найдя — рассылает во все зарегистрированные Spring-контексты (EventPublisherAspect.java:263). В тестовом прогоне в кэше TestContext висит несколько контекстов от разных @SpringBootTest-конфигураций, и все они зарегистрированы в аспекте-синглтоне. У брошенного контекста ServerContext собран не полностью — getLanguageServerConfiguration() возвращает null, — и слушатель падает. Аспект ловит RuntimeException и печатает предупреждение.

Само по себе это известно: комментарий в аспекте (появился в 08c4db15fe) прямо описывает эту тестовую особенность.

Что стоит разобрать

  1. Шум. Одно и то же предупреждение печатается сотнями. Настоящая проблема с доставкой событий в таком логе не видна.
  2. Диагностируемость. В catch печатается только e.toString() без стека — если сюда прилетит настоящая ошибка слушателя, разбирать её будет нечем.
  3. Причина, а не следствие. ServerContext без конфигурации получает события. Возможно, правильнее не слать событие в контекст, чей ServerContext не готов, чем ловить падение постфактум. Тогда и заглушка станет настоящей страховкой.

Что это не

Это не реакция на некорректный код 1С: событие про изменение содержимого документа, ввод тут ни при чём. И это не падение сборки — все проверки зелёные, поведение заглушено намеренно.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions