Match


Синхронизирует два потока заявок путем нахождения пар заявок, удовлетворяющих заданному критерию соответствия. Условие соответствия Вы должны задать сами, объект Match будет проверять его при поступлении каждой новой заявки. 

Заявки, для которых не было найдено пары, для которой выполнялось бы заданное условие, хранятся в двух очередях (по одной на каждый входящий поток заявок). По прибытии новой заявки в один из двух входных портов она проверяется на соответствие со всеми заявками, находящимися в очереди, хранящей заявки другого потока. Если соответствие будет найдено, будет выполнено Действие при соответствии, и обе заявки сразу же покинут объект через два соответствующих выходных порта. При необходимости поведение очередей может быть настроено на Вашу конкретную задачу с помощью таймаутов, вытеснения, приоритетов и т.д.

По умолчанию задано простейшее условие true. Оно означает, что любые две заявки будут соответствовать друг другу и объект Match будет работать как простой синхронизатор потоков: он будет выдавать пары заявок.

Предположим, что в одном из потоков проходят заявки класса Passenger, а в другом - класса Baggage, и у обоих этих классов есть поле id. Тогда для того, чтобы найти соответствие между заявкой, моделирующей пассажира и заявкой его багажа, Вы можете написать entity1.id == entity2.id (при этом нужно не забыть задать классы заявок Passenger и Baggage). 

Параметры класса

Классы заявок
Вход 1
Класс заявок, поступающих в порт in1, должен быть подклассом Entity. Указав класс заявки, Вы можете напрямую обращаться к полям этого класса в коде динамических параметров, таких, как onMatch.
Синтаксис: T1 extends Entity
Значение по умолчанию: Entity
Вход 2
Класс заявок, поступающих в порт in2, должен быть подклассом Entity. Указав класс заявки, Вы можете напрямую обращаться к полям этого класса в коде динамических параметров, таких, как onMatch.
Синтаксис: T2 extends Entity
Значение по умолчанию: Entity

Вложенные объекты

Queue queue1
Очередь для заявок, пришедших в порт in1.
Queue queue2
Очередь для заявок, пришедших в порт in2.

Порты

Port in1
Первый входной порт.
Port in2
Второй входной порт.
OutPortPush out1
Первый выходной порт.
OutPortPush out2
Второй выходной порт.
Port outTimeout1
Выходной порт для заявок, покидающих первую очередь из-за истечения допустимого времени ожидания.
Port outTimeout2
Выходной порт для заявок, покидающих вторую очередь из-за истечения допустимого времени ожидания.
Port outPreempted1
Выходной порт для заявок, покидающих первую очередь, будучи вытесненой другой заявкой.
Port outPreempted2
Выходной порт для заявок, покидающих вторую очередь, будучи вытесненой другой заявкой.

Параметры

Условие соответствия [динамический]
Условие, вычисляемое при поступлении новой заявки. Вычисляется для пары заявок (только что прибывшая заявка и заявка из противоположной очереди).
Синтаксис: boolean matchCondition
Локальные переменные: T1 entity1 - заявка в очереди queue1.
                                  T2 entity2 - заявка в очереди queue2.
Значение по умолчанию: true
Вместимость 1
[Параметр виден, если не выбрана опция Максимальная вместимость 1] Вместимость первой очереди queue1.
Синтаксис: int capacity1
Значение по умолчанию: 100
Максимальная вместимость 1
Если опция выбрана (true), то вместимость первой очереди будет максимально возможной (ограничена константой Integer.MAX_VALUE).
Синтаксис: boolean maximumCapacity1
Значение по умолчанию: false
Вместимость 2
[Параметр виден, если не выбрана опция Максимальная вместимость 2] Вместимость второй очереди queue2.
Синтаксис: int capacity2
Значение по умолчанию: 100
Максимальная вместимость 2
Если опция выбрана (true), то вместимость второй очереди будет максимально возможной (ограничена константой Integer.MAX_VALUE).
Синтаксис: boolean maximumCapacity2
Значение по умолчанию: false
Действие при входе 1 [динамический]
Код, выполняемый, когда заявка поступает в объект через порт in1 (и помещается в очередь queue1).
Синтаксис: void onEnter1
Локальная переменная: T1 entity - заявка. 
Действие при входе 2 [динамический]
Код, выполняемый, когда заявка поступает в объект через порт in2 (и помещается в очередь queue2).
Синтаксис: void onEnter2
Локальная переменная: T2 entity - заявка. 
Действие при соответствии [динамический]
Код, выполняемый при нахождении соответствия у двух заявок.
Синтаксис: void onMatch
Локальные переменные: T1 entity1 - текущая заявка в очереди queue1.
                          T2 entity2 - текущая заявка в очереди queue2.
Действие при выходе 1 [динамический]
Код, который выполняется, когда объект покидает заявка из первого потока, для которой было выполнено заданное условие соответствия.
Синтаксис: void onExit1
Локальная переменная: T1 entity - заявка.
Действие при выходе 2 [динамический]
Код, который выполняется, когда объект покидает заявка из второго потока, для которой было выполнено заданное условие соответствия.
Синтаксис: void onExit2
Локальная переменная: T2 entity - заявка.
Разрешить уход по таймауту 1
Если опция выбрана (true), то заявки могут покидать очередь queue1 по таймауту. После проведения в очереди максимально допустимого времени заявки будут покидать объект через специальный порт outTimeout1.
Синтаксис: boolean enableTimeout1
Значение по умолчанию: true
Таймаут 1 [динамический]
[Параметр виден, если выбрана опция Разрешить уход по таймауту 1] Выражение, вычисляющее значение таймаута для заявки в очереди queue1.
Синтаксис: double timeout1
Локальная переменная: T1 entity - заявка.
Значение по умолчанию: Double.POSITIVE_INFINITY
Действие при уходе по таймауту 1 [динамический]
[Параметр виден, если выбрана опция Разрешить уход по таймауту 1] Код, выполняемый, когда заявка покидает объект по таймауту (прождав в очереди queue1 максимально допустимое время) через специальный порт outTimeout1.
Синтаксис: void onExitTimeout1
Локальная переменная: T1 entity - заявка.
Разрешить уход по таймауту 2
Если опция выбрана (true), то заявки могут покидать очередь queue2 по таймауту. После проведения в очереди максимально допустимого времени заявки будут покидать объект через специальный порт outTimeout2.
Синтаксис: boolean enableTimeout2
Значение по умолчанию: true
Таймаут 2 [динамический]
[Параметр виден, если выбрана опция Разрешить уход по таймауту 2] Выражение, вычисляющее значение таймаута для заявки в очереди queue2.
Синтаксис: double timeout2
Локальная переменная: T2 entity - заявка.
Значение по умолчанию: Double.POSITIVE_INFINITY
Действие при уходе по таймауту 2 [динамический]
[Параметр виден, если выбрана опция Разрешить уход по таймауту 2] Код, выполняемый, когда заявка покидает объект по таймауту (прождав в очереди queue2 максимально допустимое время) через специальный порт outTimeout2.
Синтаксис: void onExitTimeout2
Локальная переменная: T2 entity - заявка.
Разрешить вытеснение 1
Если опция выбрана (true), то заявки помещаются в очередь queue2 в соответствии с их приоритетами и могут быть вытеснены из очереди заявками с более высокими приоритетами. 
Синтаксис: boolean enablePreemption1
Значение по умолчанию: false
Приоритет заявки 1 [динамический]
[Параметр виден, если выбрана опция Разрешить вытеснение 1] Приоритет поступающей в порт in1 заявки (чем больше значение, тем выше приоритет).
Синтаксис: double priority1
Значение по умолчанию: 0
Локальная переменная: T1 entity - заявка.
Действие при вытеснении 1 [динамический]
[Параметр виден, если выбрана опция Разрешить вытеснение 1] Код, выполняемый, когда заявка покидает объект через порт outPreempted1 в результате вытеснения.
Синтаксис: void onExitPreempted1
Локальная переменная: T1 entity - заявка.
Разрешить вытеснение 2
Если опция выбрана (true), то заявки помещаются в очередь queue2 в соответствии с их приоритетами и могут быть вытеснены из очереди заявками с более высокими приоритетами. 
Синтаксис: boolean enablePreemption2
Значение по умолчанию: false
Приоритет заявки 2 [динамический]
[Параметр виден, если выбрана опция Разрешить вытеснение 2] Приоритет поступающей в порт in2 заявки (чем больше значение, тем выше приоритет).
Синтаксис: double priority2
Значение по умолчанию: 0
Локальная переменная: T2 entity - заявка.
Действие при вытеснении 2 [динамический]
[Параметр виден, если выбрана опция Разрешить вытеснение 2] Код, выполняемый, когда заявка покидает объект через порт outPreempted2 в результате вытеснения.
Синтаксис: void onExitPreempted2
Локальная переменная: T2 entity - заявка.
Фигура анимации 1
Фигура анимации объекта queue1. Тип фигуры зависит от выбранного Типа анимации 1.
Синтаксис: Shape animationGuide1
Тип анимации 1
Тип анимации объекта queue1. Допустимые значения: Путь, Мешок, Упорядоченная, Набор, Одиночная.
Синтаксис: int animationType1
Значение по умолчанию: Путь
Допустимые значения: Animator.PATH, Animator.BAG, Animator.ARRANGED, Animator.SET, Animator.SINGLE
Направление анимации 1
[Параметр виден, если в качестве Типа анимации 1 выбран Путь] Направление движения анимаций по фигуре анимации объекта queue1.
Синтаксис: boolean animationForward1
Значение по умолчанию: Вперед (true)
Фигура анимации 2
Фигура анимации объекта queue2. Тип фигуры зависит от выбранного Типа анимации 2.
Синтаксис: Shape animationGuide2
Тип анимации 2
Тип анимации объекта queue2. Допустимые значения: Путь, Мешок, Упорядоченная, Набор, Одиночная.
Синтаксис: int animationType2
Значение по умолчанию: Путь
Допустимые значения: Animator.PATH, Animator.BAG, Animator.ARRANGED, Animator.SET, Animator.SINGLE
Направление анимации 2
[Параметр виден, если в качестве Типа анимации 2 выбран Путь] Направление движения анимаций по фигуре анимации объекта queue2.
Синтаксис: boolean animationForward2
Значение по умолчанию: Вперед (true)
Включить сбор статистики
Если опция выбрана (true), то для обеих очередей объекта будет собираться статистика их длин.
Синтаксис: boolean enableStats
Значение по умолчанию: false

Функции

int size1() - возвращает количество заявок, находящихся в данный момент в очереди queue1.

int size2() - возвращает количество заявок, находящихся в данный момент в очереди queue2.

T1 get1( int index ) -  возвращает заявку, находящуюся в очереди queue1 в позиции с номером index (ближайшая к выходу из очереди позиция имеет номер 0).

T2 get2( int index ) - возвращает заявку, находящуюся в очереди queue2 в позиции с номером index (ближайшая к выходу из очереди позиция имеет номер 0).

T1 remove1( T1 entity ) - извлекает заявку entity из очереди queue1 и возвращает ее. Если такой заявки в очереди обнаружено не будет, метод вернет null.

T2 remove1( T2 entity ) - извлекает заявку entity из очереди queue2 и возвращает ее. Если такой заявки в очереди обнаружено не будет, метод вернет null.