Сегодня мы рассмотрим еще одну замечательную возможность, которую предоставляет нам
Eclipse Communication Framework - обмен копиями объектов между бандлами, запущенными на разных экземплярах OSGi-фреймворка (т.е. на разных JVM), реализованную в виде
SharedObject API. Данный механизм основан на понятии
"репликация", суть которого применительно к
ECF следующая: в контейнер добавляется экземпляр класса, реализующего интерфейс
ISharedObject, который становится доступен всем другим контейнерам, подключенным к тому же серверу, что и донор. Фактически, в каждом клиентском контейнере создаются копии исходного объекта, которые называются
репликами.
Прежде всего разберемся непосредственно с распределяемым объектом. В
ECF реализован базовый класс
BaseSharedObject, который содержит реализацию многих полезных возможностей, таких как идентификация, управление конфигурацией, логгирование, отправка и прием сообщений. Рекомендуется все свои распределяемые объекты наследовать от данного класса.
Наиболее интересными для нас методами являются
BaseSharedObject#initialize(), описывающий стратегию репликации главного объекта (т.е. того объекта, который собственно копируется, для него метод
BaseSharedObject#isPrimary() вернет
true) и стратегию десериализации реплик из словаря свойств, и
BaseSharedObject#getReplicaDescription(ID receiver), задающий порядок сериализации реплицируемого объекта в словарь свойств. Словарь свойств - это объект класса, реализующего
Map<String, Serializable>.
ECF умеет передавать объекты между контейнерами только в таком виде. Чем-то данный механизм напоминает словарь свойств события, которым оперирует
EventAdmin. Данный механизм предоставляет программисту возможность наиболее гибко управлять процессом репликации своего объекта (например, определять какие поля не нужно копировать вовсе).
Стоит обратить внимание, что каждое реплицируемое поле класса должно иметь тип, реализующий интерфейс
Serializable. Дело в том, что для сериализации полей класса
ECF использует стандартные средства Java-платформы.