Управление агентами Java и Lotusscript - PullRequest
3 голосов
/ 07 сентября 2011

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

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

Ответы [ 4 ]

6 голосов
/ 07 сентября 2011

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

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

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

4 голосов
/ 07 сентября 2011

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

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

Документ «lock» может иметь флаг, который сообщает 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», еще одно преимущество заключается в том, что вы также можете фиксировать время запуска выполнения, а также ошибки или все, что вам нужно ....

1 голос
/ 07 сентября 2011

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

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

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

0 голосов
/ 22 сентября 2011

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

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

...