При разработке J2EE проекта недавно столкнулся с проблемами, которые кажутся мне достаточно часто возникающими. Может кто сталкивался и поможет?
Итак:
1. Задача: хранить между вызовами долгоинициализирующиеся объекты, которые одинаковы для всех клиентов. Например JNDI-references.
Решение: Логично что каждый раз выполнять поиск ресурсов это будет затратно, поэтому необходимо один раз их найти и дальше хранить. Можно использовать static поля бина и при одной ноде это всё будет работать.
Проблема: В кластерном окружении для каждой ява-машины будет создано своё static поле объекта. И при работе возможна рассинхронизация этих статичных полей.
Что делать чтобы бины нодов были синхронизированы? Сюда же: каким образом посылать ВСЕМ бинам во всех нодах сообщение об изменении их состояния (например имеется ввиду хранение в бине некой конфигурации, которая может меняться внешними модулями. Как послать сообщение из этих внешних модулей что конфигурация поменялась)?
2. Задача: Обеспечить взаимодействие двух J2EE модулей. Например WEB и EJB.
Решение: Логично при инициализации WEB приложение найти JNDI-reference на EJB и хранить его в контексте приложения для увеличения быстродействия. Для обращения к бизнес методу брать из контекста эту ссылку и вызывать метод.
Проблема: Доступен такой сценарий: EJB модуль был задеплоен, WEB модуль был задеплоен и в нём сохранена ссылка на EJB. Всё работает, проходит время и EJB-модуль падает или был его undeploy. При попытке обратиться по старой ссылке из WEB модуля падает NoSuchObjectException.
Как сделать более устойчивую систему без поиска ссылки при каждом обращении к EJB? В текущей реализации метод Remote-интерфейса такой:
public void doSomething();
Поможет если сделать его таким:
public void doSomething() throws NoSuchObjectException;
И перехватывать на клиенте?