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.