MDB начинает потреблять сообщения до полной инициализации имен JNDI.

КАК: Websphere 8.5.5

Внедрение MQ: SIB

Во время запуска приложения MDB начинает вызывать метод onMessage, который, в свою очередь, вызывает initialContext.lookup, чтобы найти определенный bean-компонент. Иногда (во время различных итераций запуска) он возвращает null вместо ссылки на объект компонента.

Такое поведение является недетерминированным: в некоторых итерациях запуска контекст бина успевает инициализировать все имена JNDI из-за более длительной инициализации MDB и, соответственно, паузы в потребление сообщений.

Есть ли обходной путь или волшебный ключ IBM для решения проблемы?


person uptoyou    schedule 06.09.2016    source источник


Ответы (3)


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

person Ramachandran.A.G    schedule 06.09.2016
comment
Спасибо за сообщение, но из-за предпочтений архитектора MDB не может быть выделен в качестве отдельного приложения. Я решил проблему (но я не могу гарантировать реальную причину этой проблемы), я думаю, что это был не потокобезопасный InitialContext. После замены InitialContext как INSTANCE VARIABLE на статический вызов InitialContext.doLokup() проблема исчезла. - person uptoyou; 06.09.2016

Так что, поскольку все «любят» Websphere, это, без сомнения, ошибка IBM. Извините, я солгал.... это были ДВЕ ошибки одновременно.

  • Первый: http://www-01.ibm.com/support/docview.wss?uid=swg1PI28099. Да, вам нужно исправить эту ошибку самостоятельно !!! Просто добавьте это пользовательское свойство jvm на свой сервер: com.ibm.ejs.j2c.J2CServerListener.activateEndpointsOnCRAStarted = true
  • Второй: http://www-01.ibm.com/support/docview.wss?uid=swg1PM62774 Ага, это тебе надо починить... барабанную дробь... тоже самому!!! Просто добавьте второе пользовательское свойство на свой сервер: com.ibm.ws.cdi.immediate.ejb.start = true
person uptoyou    schedule 17.11.2017

Если у вас есть какая-либо дополнительная инициализация внутри MDB, полезно рассмотреть аннотацию @PostContruct. У меня тоже было слишком раннее срабатывание onMessage, до завершения инициализации, в результате чего сообщение не обрабатывалось. После добавления моей дополнительной логики инициализации в метод с этой аннотацией моя проблема была решена.

@PostConstruct
    public void initialize() {
....
}
person Jo-dee    schedule 17.11.2017
comment
спасибо за ваш ответ, там было несколько условий, которые не позволяли мне использовать @Postconstruct (опубликовал свое решение) - person uptoyou; 18.11.2017