Работа с привязками

Привязки позволяют устанавливать и управлять связями между разными частями единой модели данных сервера, например, ячейками в таблице БД или переменными/функциями/событиями разных контекстов.

Несмотря на то, что привязки обычно не требуют кастомизации, есть возможность реализовать и использовать ваш собственный пользовательский движок с того момента, как соответсвующие классы стали частью 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() должен быть применен.