Работа с привязками
Привязки позволяют устанавливать и управлять связями между разными частями единой модели данных сервера, например, ячейками в таблице БД или переменными/функциями/событиями разных контекстов.
Несмотря на то, что привязки обычно не требуют кастомизации, есть возможность реализовать и использовать ваш собственный пользовательский движок с того момента, как соответсвующие классы стали частью API с открытым исходным кодом.
Движок привязки базируется на нескольких основных классах и интерфейсах:
BindingProcessor
управляет выполнением привязок и соответствующих потоков.BindingProvider
определяющий действия для выполнения привязок и использования их результата.Binding
определяет саму привязку.
Реализация процессора привязок
Процессор привязок не требует кастомизации. Стандартный класс DefaultBindingProcessor
может быть использован в большинстве сучаев.
Реализация поставщика привязок
В отличие от процессора, у поставщика привязок должны быть пользовательские реализации в каждом движке привязок.
Следующий минимальный набор методов должен быть переписан для кастомизации:
createBindings()
, возвращающийMap<Binding, EvaluationOptions>
с объектами привязок и их опциями вычисленияwriteReference(int method, Binding binding, Reference cause, Object value, ChangeCache cache)
, которые выполняют изменение целиbinding
в предоставленноеvalue
Method
должен быть одним из:
EvaluationOptions.STARTUP
EvaluationOptions.EVENT
EvaluationOptions.PERIODIC
Если пользовательская реализация не основывается на стандартном ContextBindingProvider
, также будет важно реализовать методы, которые добавляют и удаляют слушателей ссылки, которые вызываются при изменении состояния выполнения определенной привязки. Методы следующие:
addReferenceListener(Reference ref, ReferenceListener<T> listener)
removeReferenceListener(ReferenceListener<T> listener)
Пользовательский поставщик привязок должен информировать слушателей об определенном изменении, которое должно вызывать выполнение привязки с помощью события. Это происходит путем вызова метода referenceChanged(final Reference cause, final Map<String, Object> environment, ChangeCache cache, boolean asynchronousProcessing)
, ранее добавленного ReferenceListener
.
Использование движка привязки
Использование пользовательского движка привязки является несложным:
- Первым делом должен быть создан
BindingProcessor
. Он обычно принимает экземпляр пользовательскогоBindingProvider
как аргумент. Также пользовательский пул потоков используется для параллельно работающего процесса привязки, который может быть представлен аргументом конструктора. - Дальше процесс привязки должен быть инициирован путем вызова метода
start()
. - Как только движок прерывается, метод процессора привязки
stop()
должен быть применен.