Показать сообщение отдельно
Старый 11.12.2009, 17:43   #20  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Все, абсолютно все, "ждущие" ("слушающие") системы основаны на таймере. И пакетная обработка в том числе. Просто все настолько "тонет" во всяких "умных" словах и настройках или скрыто внутри "системного" кода, что добраться до сути становится проблематично...

Т.е. по таймеру, через определенные интервалы времени, запускается некий код, который проверят нет ли чего для выполнения. Далее - по ситуации.

В Axapta, основой для ручного создания таймера, является метод setTimeOut(), который есть у любого класса, поскольку это метод "базового" ("родительского") класса Object. Соответственно, если нужен "глобальный" слушатель, то следует вызвать setTimeOut() глобального же объекта. Удобнее всего это сделать в глобальном классе Info.

Общая схема примерно такая:

1) В классе Info создается собственный метод, например info.MyMethod(), в котором и производится анализ того, не надо ли что-то сделать.

2) В методе info.executeUserOptions() организуется вызов этого метода по таймеру примерно так

X++:
this.setTimeOut(identifierstr(MyMethod), 30*1000, false);
3) В самом методе в самом конце также организуется "самовызов" по тому же таймеру

X++:
this.setTimeOut(identifierstr(MyMethod), 30*1000, false);
Далее уже "техника". У Вас есть метод info.MyMethod(), который автоматически запускается при запуске Axapta и периодически, с некоторым интервалом, запускается в процессе работы. Вам остается только организовать "чтение" некой служебной информации (таблицы) и запуск других классов и методов, на основе этой информации.

Правда, возникает дополнительная проблема "совместного доступа". Т.е. чтобы два (или более) сеанса не начали выполнять одно и то же задание. Как это "разрулить" решается в каждом конкретном случае. В зависимости от того, что именно должно быть сделано.

Да, кстати, если обмен директивами идет через таблицу, то ее ни в коем случае не надо кешировать. Вам ведь надо всегда читать актуальную информацию, а не то, что сохранено в кеше.

==============================================================

Но, вообще-то, присоединяюсь к sukhanchik. Сначала ответьте самому себе ЧТО Вы собираетесь выполнять таким способом? Не "общими словами" вроде "администратору захотелось", а именно вполне конкретно. Например: администратору надо сделать перезагрузку AOS.

Далее попробуйте уточнить, обязательно ли для этой обработки запускать для ВСЕХ клиентов или достаточно, чтобы работал хотя бы один клиент? А нельзя запустить этого одного именно тогда, когда "администратору захотелось"?
За это сообщение автора поблагодарили: konfet (1), raniel (1), someOne (5).