Добрый день!
Пытаюсь смоделировать обработку заявок в соответствии с
графиком рабочего времени.
График рабочего времени задан с помощью табличной функции, 24
записи которой заполнены нулями и единицами (рабочий и нерабочий
час).
Хочу, чтобы в нерабочие часы обработка некоторых заявок
полностью останавливалась (из-за отсутствия ресурсов).
Пробовал изменять доступность ресурсов: в рабочее время 10
рабочих, а в нерабочее - 0.
Однако, как написано в справке, "если вместимость объекта Delay
меняется динамически, и количество заявок, находящихся в объекте
в данный момент времени, превышает значение вместимости объекта,
то объект Delay даст каждой такой заявке завершить ее время
ожидания".
Как сделать, чтобы заявки дожидались обрабатывающих их рабочих?
Есть ли простой способ?
Влад — 16.10.09
Здравствуйте!
Не очень ясно, почему Вы используете изменение вместимости блока
"Delay"? Насколько я понимаю, проще было бы менять количество
доступных ресурсов. Если свободных ресурсов ноль, то заявка
ожидает в очереди, встроенной в "Seize" или "Service".
Антон — 16.10.09
Наверное, не очень корректно объяснил.
Допустим, заявка должна обрабатываться 16 часов. Для её обработки
нужен ресурс "Рабочий".
У рабочего смена - с 9 до 18 с перерывом с 13 до 14. Я хочу, чтобы
обработка заявки как-то останавливалась, когда рабочего нет.
Но как это сделать с помощью Enterprice Library я не знаю.
Пробовал задать доступность Рабочего табличной функцией.
Количество доступных рабочих стало изменяться в зависимости от
времени дня (т.е. с 18 до 9 - это 0 рабочих). Однако, получается, что как
только рабочий возьмется обрабатывать заявку, так она и будет
непрерывно обрабатываться даже без участия рабочего.
Понятно, что после завершения обработки этой заявки другие на
вход не пойдут. Но суть проблемы не в этом.
Есть идея попробовать с момента ухода Рабочего оценивать,
сколько заявка обрабатывалась без рабочего, записывать это
значение в атрибуты заявки, и после выхода заявки, в случае, если
это число больше 0, подавать её обратно на вход с первейшим
приоритетом. Но эта идея кажется мне несколько непрямой.
Павел — 17.11.09
Здравствуйте, Антон!
Я думаю, эту идею можно реализовать следующим образом. Пусть
заявка захватывает ресурс в блоке "Seize", а затем поступает в
"Delay". Как только заканчивается смена рабочего, заявку можно
удалить из "Delay" методом "delay.remove()" и поместить, например,
в блок "Queue". Также перед удалением заявки необходимо
определить оставшееся время обработки с помощью метода
"delay.getRemainingTime()". С началом новой смены заявку можно снова
отправить в "Delay" и установить требуемое (оставшееся) время
обработки.
Надеюсь, это Вам поможет :)