Есть стек технологий: Java EE (WebSpere), JPA, EJB3, JMS (MDB), JSF.
Архитектура: сообщения JMS поступают (через MDB) и регистрируются как постоянные сущности (с помощью EntityManager). Существует класс Singleton с бесконечным циклом, который отвечает за обработку этих сущностей. Singleton уведомляется о созданных сущностях MDB. Изначально сущности хранятся в очереди внутри синглтона. Созданный объект может обрабатываться до нескольких минут. Одновременно может обрабатываться не более определенного количества сущностей (несколько параллельных процессов в Singleton). Синглтон не является EJB, но он использует службы EJB. Существует класс, который представляет контекст выполнения для данного объекта (простой DTO). Контекст выполнения содержит зависимости от необходимых EJB и создается на этапе взаимодействия MDB и передается службе Singleton вместе с уведомлением о новом сообщении (в основном MDB аннотирует инъекции этих EJB и EM и создает новый контекст выполнения, передавая эти внедренные экземпляры).
Проблема в том, что обработка сущности запускается, но EntityManager в какой-то момент времени (через несколько секунд) начинает возвращать нули для поисковых запросов, а этого быть не должно, так как буквально секунду назад сущность была обновлена.
Похоже, что с архитектурой не все в порядке. Я подозреваю, что поведение EM является признаком того, что контекст персистентности исчез через некоторое время после взаимодействия между MDB и Singleton. Срок службы синглтона намного больше, чем срок жизни любого управляемого компонента в системе. Таким образом, внедрение экземпляров EJB (и экземпляра EM) в такой компонент, по-видимому, вообще не является решением (передача ссылок на внедренные экземпляры EJB из MDB в Singleton, вероятно, является худшим решением).
Возможно, EJB, а также EM должны искаться синглтоном с использованием JNDI каждый раз, когда они нужны? В этом случае следует ли блокировать EJB для каждого вызова?
Как бы вы спроектировали систему: если бы MDB регистрировала только сообщения (как сущности). И обработка сущностей может начаться позже. И вы должны использовать некоторые службы EJB (локальный интерфейс). А еще есть Entity Manager.