Пакетирование
Компонент технологического управления пакетируется в двух элементах EJB: u сеансовом bean без состояния, предназначенном для управления экземплярами модели технологического управления, и bean-сущности, предназначенной для управления самой моделью (рис. 17.8). Это решение о пакетировании компонента обусловливается исключительно характеристиками различных типов EJB, Рис. 17.8. Диаграмма пакетов компонента технологического управления
Абстракции, реализуемые в приложении сущностными EJB, выражают совместно используемые ресурсы, в рамках которых данные устойчивого объекта доступны многочисленным компонентам и пользователям. Модель технологического управления представляет единственный ресурс подобного рода, а именно процесс, допускающий многократную конкретизацию. Любой пользователь приложений Inmedius, независимо от своего местоположения, может запускать новые процессы, основанные на упомянутой модели технологического управления, и участвовать в их действиях. Сеансовые элементы EJB моделируют состояние и поведение. В продолжение жизненного цикла экземпляра технологического процесса или сеанса пользователям предоставляются различные службы — в частности, определения новых моделей технологического управления, создания экземпляров технологического управления, создания действий, распределения между действиями ресурсов и завершения действий. Таким образом, реализация экземпляров технологического процесса в виде сеансовых EJB вполне естественна. После принятия решения о представлении диспетчера экземпляра технологического процесса в виде сеансового элемента EJB необходимо было определиться с тем, к какому типу этот элемент будет принадлежать, — будет ли он сохранять состояние или нет. Решение этого вопроса зависело от характеристик сохраняемого состояния. Как правило, сеансовый EJB с запоминанием состояния сохраняет информацию о состоянии для того клиента, с которым он в данный момент поддерживает диалог. В то же время состояние экземпляра технологического процесса в период прогона обновляется несколькими клиентами — в частности, теми, которые участвуют в процессе технологического управления, и диспетчерами, которые отслеживают процесс и анализируют его результаты. Исходя из этого диспетчер экземпляров технологического управления решили реализовать в виде сеансового EJB без запоминания состояния — во-первых, он более легковесен и масштабируем, чем сеансовый EJB с запоминанием состояния, а во-вторых, информацию о состоянии он сохраняет от имени конкретного клиента в базе данных, к которой могут обращаться все остальные клиенты. С тем, как пакетировать отдельные объекты в рамках модели технологического управления, было связано еще одно компромиссное решение. Следует ли их пакетировать в виде сущностных EJB или в виде Java-клaccoв, пакетированных в другой структуре (например, в библиотеке)? Поскольку эти объекты взаимодействуют и зависят друг от друга, при их пакетировании в виде сущностных EJB нужно было бы постоянно обнаруживать местонахождение и сохранять многочисленные EJB-дескрипторы приложения, а следовательно, вводить дополнительные издержки. Кроме того, как мы помним, вызов любого метода в EJB производится удаленно (в виде RMI), а значит, также связан с непроизводительными издержками. Большинство контейнеров J2EE способны определять, относится ли вызываемый метод к той же виртуальной машине Java, к которой принадлежит вызывающая сторона, и, таким образом, оптимизировать его до локального вызова, но все-таки это делают далеко не все. Исходя из этих соображений было принято следующее проектное решение. Крупные абстракции (такие, как модель технологического управления) в приложении предполагалось выразить в виде объектных EJB, а относительно мелкие — реализовать в сущностных EJB в виде библиотеки классов. Все эти операции были направлены на снижение дополнительных издержек, связанных с тяжеловесными отношениями между сущностными EJB. Рассматриваемое проектное решение компонента технологического управления, в частности, выразилось в вопросе о расположении логики, ответственной за подачу запроса на ключ модификации модели технологического управления. Изначально эта логика располагалась внутри сущностного элемента EJB, реализовывавшего модель технологического управления. Запрос на выделение ключа должен был отправляться напрямую этому сущностному элементу, который в свою очередь должен был принимать решение о его предоставлении или непредоставлении (а в случае предоставления — о блокировке модели для других пользователей). Эта проблема стала очевидной, когда пришло время корректировать бизнес- логику, — так, чтобы ключ выдавался только в отсутствие активных экземпляров технологического управления периода прогона. Методы, предоставлявшие информацию об экземплярах технологического управления в период прогона, определялись в сеансовом элементе EJB с запоминанием состояния — объекте, взаимодействовавшем с сущностным EJB. Решение о передаче ссылки на сеансовый EJB с запоминанием состояния сущностному EJB оказалось неоптимальным — в первую очередь, по той причине, что в таком случае сущностный EJB был бы привязан к среде (а следовательно, возможность повторного использования исключалась); во-вторых, потому что сущностный EJB обращался бы к сеансовому EJB с запоминанием состояния только посредством удаленных вызовов методов. В принципе, можно было бы напрямую обращаться к объектам доступа к данным, извлекая с их помощью из базы данных всю необходимую информацию. Однако в этом случае реализованная в сущностном EJB абстракция оказалась бы нарушенной, в связи с чем он получил бы дополнительные обязанности, относящиеся к другому объекту. Наконец, такое решение предполагает дублирование кода, затрудняющее сопровождение. Было найдено следующее решение. Логика (регулирующая предоставление ключа для изменения модели технологического процесса) помещалась в сеансовый EJB без состояния. Сущностный EJB в таком случае знает, как извлекать ключи из базы данных и помещать их в нее. При получении запроса на предоставление ключа сеансовый EJB без состояния определяет возможность его предоставления и, если таковая существует, инструктирует сущностный EJB относительно блокировки модели технологического управления. Такое решение сохраняет целостность реализованных в объектах абстракций и устраняет излишние взаимосвязи между элементами EJB.
|