Возможное состояние гонки в Singleton Bean

Я сталкиваюсь с тем, что кажется состоянием гонки в компоненте Spring, который вызывается из сторонней библиотеки, и я пытаюсь определить, есть ли проблема с моей реализацией или проблема, возможно, связана со сторонней библиотекой.

@Override
public InputObject addMessageToInput(InputObject input) {

    List<String> messages = doStuff();

    log.debug("Messages are {}", messages);//messages appear to be correct at this point

    doLongRunningOpertation(); 

    log.debug("Messages are {}", messages);//messages appear to be correct at this point
    input.addMessages(messages);

    return input; //Return to third party library here
}

После возврата этой функции сторонняя библиотека обрабатывает отображение сообщений во внешнем интерфейсе. Проблема, которую я вижу, заключается в том, что сообщения, отображаемые на внешнем интерфейсе, иногда содержат больше или меньше сообщений, чем должны. Я также должен отметить, что программа НЕ многопоточная.

Есть ли что-то, что мне не хватает в моем коде, что может вызвать это состояние гонки?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
156
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что ж, может произойти много всего, но я думаю, что ваш код выглядит вполне нормально.

Кое-что для рассмотрения...

Передается ли вообще список messages в методе doLongRunningOperation()? Если да, помещается ли он в переменную класса в любой момент?

Является ли InputObject новым объектом каждый раз, когда он передается в ваш код? Если нет, то это может вызвать проблемы.

Является ли переменная InputObjectmessages пустой, когда она входит в ваш код?

Вы можете рассмотреть возможность возврата нового экземпляра InputObject вместо использования экземпляра, отправленного вашему методу.

Вы можете закомментировать длительный процесс, чтобы увидеть, сохраняется ли проблема.

Если вы видите, что проблема повторяется в вашей конкретной среде разработки, вы можете поставить точку останова отладки в методе InputObject.addMessages() и посмотреть, когда он вызывается.

Просто несколько идей для размышления и, возможно, попытки решить проблему.

Еще одна мысль... Возможно, переменная InputObjectmessages манипулируется вне InputObject. Я видел, как это случалось и раньше. Это означает, что коллекция сообщений, возвращаемая из InputObject, является изменяемой, а не неизменной, и некоторый код взаимодействует с этой ссылкой.

hooknc 11.05.2019 00:08

Отметив это как принятый ответ, поскольку это помогло мне с большей уверенностью определить, что проблема не в коде, опубликованном выше. Фактическая проблема заключалась в том, как сторонняя библиотека отображала сообщения пользователю, у которого было несколько активных сеансов.

KBusc 13.05.2019 21:04

Другие вопросы по теме