Управление агентами Java и Lotusscript

Я создал 2 агента, один на Java, а другой на Lotusscript. Запуск агента java запланирован каждые 5 минут, а агента lotusscript - каждые 15 минут. Поэтому наступит время, когда они будут работать одновременно. Когда это происходит, java-агент должен приостановить / дождаться завершения работы агента lotusscript. Я попытался смоделировать блокировку с помощью Profile DOcuments и Environment Variables, но безуспешно. Есть ли способ имитировать блокировку между этими двумя разными агентами? Пожалуйста помоги. Большое спасибо!

Изменить: я забыл сказать, что 2 агента находятся в ДВУХ РАЗНЫХ базах данных, чтобы еще больше усложнить ситуацию :(


person John Bautista    schedule 07.09.2011    source источник


Ответы (4)


Почему бы не написать третьего агента (возможно, в дополнительной базе данных), который запускается периодически каждые пять минут и запускает два других агента:

  1. Агент сценария Lotus каждый раз
  2. Агент Java каждый третий запуск

... тогда вы также контролируете порядок выполнения без каких-либо сложных механизмов блокировки.

person spookycoder    schedule 07.09.2011
comment
Собственно, это действительно хороший ответ! Я проверю, смогу ли я заставить это работать! Спасибо. - person John Bautista; 08.09.2011
comment
Я видел, как использовался этот подход, и он подходит в относительно простых ситуациях, небольшие масштабы - это нормально. Но я видел, как этот подход приводит к сбою серверов. Основной риск заключается в том, что когда агент вызывает других агентов, он больше не находится под контролем настроек сервера для агентов. На сервере есть настройки дросселирования, чтобы агент не потреблял 100% ЦП. Агенты, вызываемые от других агентов, могут делать то, что им нравится. Также у вас не будет указания на то, что называется субагентом в журнале Notes. Так что это несет в себе риски. - person angryITguy; 10.09.2011
comment
Вы также можете подумать о том, чтобы 5-минутный агент звонил Java-агенту каждый третий раз (или, возможно, проверяя часы и NotesAgent.LastRun). - person Jon McAuliffe; 13.09.2011

Это почти надежный способ, который, как я обнаружил, работает для управления порядком выполнения независимых агентов. Я использую настоящий документ заметок как документ с псевдоблокировкой.

Раньше я делал это так, чтобы сохранить документ Notes, который представляет собой «блокировку». Не используйте документ профиля базы данных, поскольку он подвержен конфликтам репликации / сохранения, и вы не можете просмотреть его в представлении.

Документ «блокировки» может иметь флаг, который сообщает java-агенту, разрешено ли ему запускаться сейчас. В Java-агенте просто есть код, похожий на этот

Session s = NotesFactory.createSession();
Database db = s.getDatabase("This Server", "This database");
View vw = db.getView("(lockView)");
Document docControl = vw.getFirstDocument();
String sRunStatus = docControl.getItemValueString("runStatus");
boolean bContinue = false;
if (sRunStatus =="Go"){
    bContinue = true;
}
if(bContinue){
    //do agent code here....

    // reset the status to "wait". The lotusscript agent should then set it to "Go"
    // the other agent will execute on "wait" and then update the status to "Go" on 
    // completion to prevent simulatenous execution. Can also use different state names
    // instead of go/wait, like run0, run1, run2 etc
    docControl.replaceItemValue("runStatus", "wait");
    docControl.save(true);
}

Обратите внимание, что вы используете агентов для установки значений «Go» / «wait» в поле «runStatus» в контрольном документе. Вам нужен только 1 документ, поэтому вам нужно вывести только первый документ из представления.

Аналогичную логику следует еще проще добавить в агент LotusScript. Единственный недостаток, который я могу найти, заключается в том, что java-агент может не выполнять код, потому что контрольный документ еще не настроен на «go», а тест «IF» завершается неудачно без запуска логики, поэтому это не пауза как таковая, а предотвращает Java-агенту от выполнения с агентом lotusscript не в желаемом порядке. Но затем он сработает на следующем запланированном экземпляре, если агент LotusScript выпустил его.

Вы также можете расширить эту идею, чтобы управлять набором агентов и даже объединять несколько агентов в цепочку, используя определенные значения, такие как «RunAgent1», «RunAgent2», еще одно преимущество заключается в том, что вы также можете фиксировать время начала выполнения, ошибки или что-то еще. вам нужно ....

person angryITguy    schedule 07.09.2011
comment
Если вы не используете это вместе с функцией блокировки документов Notes / Domino, вы не останетесь довольны. Что произойдет, если оба агента будут запущены одновременно, прочтут runStatus, увидят Go и оба будут запущены после обновления документа (возможно, создаст конфликтный документ)? Если вы используете такой семафор, вам потребуется блокировка документа, как уже указывал Джаспер. - person leyrer; 07.09.2011
comment
Не может быть. Если вы внимательно прочитаете логику, которую я написал, вы увидите, что использование определенного статуса для каждого агента, на котором он будет работать, разрешит запуск только этого конкретного агента. Я не сказал, что оба агента работают на Го, как вы намекаете. Таким образом, если agentA выполняется на Go, а agentB выполняется на Wait, то только 1 агент фактически выполнит требуемую бизнес-логику, даже если оба выполняются одновременно. Я обновил ответ, чтобы более четко изложить поднятый вами вопрос. Буду признателен, если вы пересмотрите свой отрицательный голос на этом основании. - person angryITguy; 07.09.2011
comment
Это действительно ожидание? Это больше похоже на отмену, попробуйте в следующий раз. Я бы попытался использовать Thread.sleep (), чтобы заставить его подождать x секунд, а затем повторить попытку. - person Jasper Duizendstra; 07.09.2011
comment
Я изменил приведенный ниже код (фактически, до вашего ответа я реализовал нечто подобное, используя документы профиля). Вместо простого события continue я выполнил бесконечный цикл, ожидающий, пока значение в документе блокировки не изменится. Я знаю, что в Java данные передаются по значению, поэтому я снова и снова получал документ в состоянии while, просто чтобы убедиться, что новый документ передан. Но все же изменения в документе блокировки не появляются при одновременном запуске 2 агентов. - person John Bautista; 07.09.2011
comment
@Jairo, у вас не должно быть бесконечного цикла, это заблокирует очередь в диспетчере агентов, и если у вас только одна очередь, вы предотвратите выполнение агентов до тех пор, пока не будет достигнут предел тайм-аута для агентов. Это также нагружает сервер до максимального предела ЦП для агентов на сервере. Я считаю, что по умолчанию установлено 70%. Так что не делайте бесконечного цикла. Если частота критическая, вы можете запустить java-агент из LS-агента. Это также связано с некоторыми рисками, но было бы намного лучше, чем бесконечный цикл. Есть и другие подходы, но это приведет к перекодированию ваших агентов. - person angryITguy; 07.09.2011
comment
@Джаспер. Thread.Sleep почти так же неуместен, как бесконечный цикл. Блокирование очереди диспетчера агентов повлияет на работу других агентов на сервере. И я думаю, вам все равно нужно будет периодически просыпаться, чтобы проверять, должен ли агент продолжать работу. Опять же, существует риск того, что агент в любой момент отключит тайм-аут и заблокирует других агентов. Хотя Хайро просит одного агента подождать, на самом деле он просит управлять порядком выполнения агентов. - person angryITguy; 07.09.2011
comment
Я считаю, что попытки контролировать поток агентов относительно друг друга в любом случае - плохая идея. В этом случае документы создаются каждые 5 минут и извлекаются каждые 15. Возможно, что агент создания блокирует агент выборки, поэтому переход в спящий режим вместо повторной попытки повторяется позже. Если он продолжает давать сбой при каждом пробуждении, агент выборки работает слишком долго, и это само по себе будет проблемой. Скорее всего, решение в другом месте, а не в удалении документов, их обновлении. - person Jasper Duizendstra; 07.09.2011
comment
Я согласен, что описанный дизайн - не лучшая ситуация. Но я могу понять, как эти вещи развиваются с течением времени. Несмотря на недостатки, это хороший вопрос, потому что разработчики Domino сталкиваются с проблемами планирования работы агентов, и я обнаружил, что этот подход работает в большинстве случаев. - person angryITguy; 07.09.2011

Включение блокировки документов в базе данных может работать. Если вы можете включить блокировку документов в самой базе данных, вы можете заставить агентов заблокировать определенный документ и проверить, заблокирован ли документ до / во время выполнения кода.

Если включение блокировки документов в этой базе данных не является вариантом, вы можете рассмотреть возможность создания отдельной базы данных, сохраните документ.

Почему эти агенты не могут работать одновременно? Возможно, удастся достичь того же результата, разрешив агентам работать одновременно. Попытки контролировать агентов таким образом обычно приводят к другим проблемам. Если в базе данных есть реплики, решение может сломаться.

person Jasper Duizendstra    schedule 07.09.2011
comment
Агент Java создает документы из данных веб-службы, а затем удаляет дубликаты, в то время как агент lotusscript извлекает документы из базы данных, в которой находится агент Java. Как видите, java-агент должен приостановить работу, если когда-либо обнаружит, что извлечение документа еще не завершено, иначе будут извлечены дублированные документы. - person John Bautista; 07.09.2011
comment
Дубликаты - это документы, которые были созданы агентом Java и еще не извлечены агентом Lotus Script? - person Jasper Duizendstra; 07.09.2011
comment
да. Затем агент java должен удалить более старые копии документа (которые являются «дубликатами»), чтобы последние извлекались каждый раз, когда агент lotusscript извлекает документ. - person John Bautista; 07.09.2011
comment
Можно ли включить блокировку документов? Вместо удаления вы можете заблокировать документ и выполнить обновление. - person Jasper Duizendstra; 07.09.2011
comment
Нет, старые документы нельзя просто заблокировать. База данных создает документы из данных веб-службы КАЖДЫЕ 5 МИНУТ, поэтому объем данных быстро растет. - person John Bautista; 07.09.2011
comment
Еще один комментарий: эта настройка обычно генерирует много заглушек для удаления. Это немного сбивает с толку. Почему бы не сохранить копию данных в базе данных и не обновить, если это дубликат? И пусть агент сценария lotus пометит запись как прочитанную после ее обработки. - person Jasper Duizendstra; 07.09.2011
comment
позвольте нам продолжить это обсуждение в чате - person Jasper Duizendstra; 07.09.2011

Вы сказали, что это две базы данных, но на самом деле самый простой способ остановить одновременную работу агентов - это поместить их в одну базу данных. Я очень часто создаю специальную базу данных, которая содержит только агентов и документы журнала, созданные агентами. Агенты могут открывать любую базу данных, поэтому не имеет значения, где они находятся.

Однажды я также руководил проектом, в котором мы создали собственный механизм управления агентами, который представлял собой комбинацию идей Джулио и spookycoder. Был запланирован только один «главный» агент, и он прочитал управляющий документ, чтобы решить, какой агент должен запускаться следующим. Допустим, у нас есть агенты A, B и C. Мастер запускает A, который немедленно обновляет контрольный документ, говоря «Я работаю», затем обновляет поля своей информацией о ходе выполнения, и, наконец, когда это делается, обновляет контрольный документ с помощью "B". В следующий раз, когда мастер запускается, он просматривает контрольный документ. Если информация о ходе выполнения показывает, что А закончил, мастер увидит, что настала очередь Б бежать. Конечно, A может понять, что у B нет работы, поэтому он мог бы вместо этого написать «C», и в этом случае мастер будет запускать C. Мастер также имеет возможность повторно запустить A, если информация о ходе выполнения показывает, что это не закончило работу.

person Richard Schwartz    schedule 21.09.2011