Ls агенты: проблема запуска с сервера на сервере

  • Автор темы AlexyeNov
  • Дата начала
A

AlexyeNov

#1
Имею Сервер1, на котором юзер запускает агент1 через RunOnServer.
Агент1 запускает через RunOnServer Агент2, находящийся на другом сервере.
Возникает ошибка "Cannot access foreign servers when running on a server"

Оба агента - Lotus Script-овые, агенты (NotesAgent) получаются через NotesDataBase.GetAgent.

В настройках безопасности, в разделе Трастед в обоих серверных документах прописаны данные серваки.

Версия сервера : 7.0.4

Кто знает, как разрулить ? :)

В инете бегло порылся, пишут что нужно юзать Java либо HTTP... не шибко хотелось бы.
Пысы: оба агента получают параметры NoteID на вход, нужно передачу параметра сохранить.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#2
AlexyeNov
жуткая конструкция
я бы лучше пулял в другой сервер док-запрос, и там бы агент САМ стартовал, чем вот тот дергаться
 
A

AlexyeNov

#3
AlexyeNov
жуткая конструкция
я бы лучше пулял в другой сервер док-запрос, и там бы агент САМ стартовал, чем вот тот дергаться

Насколько в таком случае удастся сохранить синхронность и оперативность вызовов?
Агент1 должен получить результат работы Агента2 (документ-отчёт передаётся на вход Агенту2)

В целом задача такая:
Пользователь работает на Сервер1,
Пользователь не имеет доступа к Сервер2
Пользователь имеет полномочия на запуск агентов на Сервер1
Сервер1 имеет доступ на Сервер2
Пользователю требуется выполнить агент на Сервер2 и получить результат работы

ТАким образом, наиболее очевидной видится как раз указанная мной в первом сообщении схема.

Вместе с юзером это:

Юзер -> Сервер1 { CreateDocument.NoteID 1 -> Agent1.RunOnServer(NoteId 1) } -> Сервер2 {CreateDocument.NoteID 2 -> Agent2.RunOnServer(NoteId 2) -> NoteId 2 -> } -> Сервер1 {Перекладываем результат в NoteId 1}-> Юзер сотрит на то, что лежит в NoteID 1, получает информацию

Юзер - видит Сервер1, но не видит Сервер2
Agent1 - агент на первом сервере, NoteId 1 - документ на Сервер1, в котором пользователь видит результат работы Agent2
Agent2 - агент на втором сервере, NoteId 2 - документ на Сервер2, в который пишет результат работы Agent2. После его работы, результат будет скопирован в документ NoteID 1, который лежит на Сервер1

NoteId 2 нужен, поскольку Сервер2 не знает, с какого сервера произошел вызов его агента.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#4
зачем, вообще, нужна такая схема?
 
A

AlexyeNov

#5
зачем, вообще, нужна такая схема?
На Сервер2 стоит Sap Connector (с набором RFC библиотек). У Сервер1 не должно быть этого.
Тоесть, пользователь работает с Sap через Сервер2, не имея к нему непосредственного доступа.
Ещё более точно - Сервер1 может быть где нить на дальнем востоке, а Сервер2 - в Москве...

пысы:
Схема Агент1.Run -> Agent2.RunOnServer не подходит - в этом случае у Юзера должны быть полномочия на доступ к Сервер2
пысы2:
Схема Агент1.RunOnServer ->Agent2.Run не подходит, поскольку в этом случае Agent2 выполняется на Сервер1, и будут ошибки создания объекта Sap Connector по причине отсутствия RFC библиотек на Сервер1.

оба пысы проверены...


пысы3: будут толковые предложения ??? :)
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#6
Насколько в таком случае удастся сохранить синхронность и оперативность вызовов?
думаю, не удастся. агенты по обработке стартуют не в момент появления документа, а попозжее.
зачем, вообще, нужна такая схема?
эта фраза заставляет задуматься, что подобное реализовать нельзя, либо сложно :))
хотя...

чем не устраивает дергание по http? сервера уже в трастед прописаны ;)
Код:
http://Host/Database/AgentName?OpenAgent&pd=ParameterDocUnid
агент получает в контексте документ с цги-переменными, тебе нужно обработать Query_String
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
Код:
	Dim s As New NotesSession
Dim db As NotesDatabase
Dim wdc As NotesDocument
Dim pddoc As NotesDocument
Dim qs As String
Dim pdunid As String

Set wdc = s.DocumentContext
Set db = s.CurrentDatabase

qs = wdc.GetItemValue("Query_String")(0)
pdunid = StrRight(qs, "=") ' других ключей не должно быть
Set pddoc = db.GetDocumentByUnid(pdunid) ' подразумевается, что агент и парам-док в одной базе
Call pddoc.ReplaceItemValue("SomeItem", "SomeValue:" & Now)
Call pddoc.Save(True, False)
но, остается под вопросом синхронизация выполнения кода. придется в таком случае цеплять цикл ожидания и опрос документа-параментов.

еще можно сбацать свой domino add-in - сервер, который будет на определенном порту принимать определенные запросы и выполнять нужные операции. с пом java, думаю, будет не очень сложно такое сделать.
примеры можно легко нагуглить "domino add-in java":
http://www.nsftools.com/tips/JavaTips.htm#javaaddin
зы: сдаю lmike как знатока lotus + java ;)
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#7
ужасная и безтолковая конструкция...

а что нельзя на сервере1 иметь реплику или часть базы сервера2?
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#9
Akupaka
читай выше, я предложил сделать:
1) через документ запрос
2) через один сервер посредством реплики, копии и других сокращенный данных которые могут быть разрешены юзеру
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#10
ну, если ты так уверен, что твое предложение (1) лучше, то почему бы тебе не ответить на остальные вопросы, которые тебе же задали? ))
Насколько в таком случае удастся сохранить синхронность и оперативность вызовов?
Агент1 должен получить результат работы Агента2 (документ-отчёт передаётся на вход Агенту2)
кроме того, в первом же посте было указано, что документ-параметр, или как ты назвал "документ запрос", используется. вопрос был в том, как заставить его обработать агентом на другом сервере, сохранив, при этом, синхронность выполнения кода.

а предложение (2) не предложение, а встречный вопрос, как бы: "автор, ты догадайся как это использовать сам, ага?" :)
 
A

AlexyeNov

#11
ToxaRat: Реплика меня не спасёт.
Толку от репликиv никакого, когда выполнение кода и синхронный ответ должны производится именно на Сервер2 ?
Ведь именно там лежат библиотеки связи с SAP.


Akupaka: Domino Add IN на жаве это интересно... только опять таки, будет ли работать синронность ? Ведь мне важно не только послать запрос на сервер2 (тоесть, вызвать агента2), но и получить ответ, в текущей сессии вызова.

/*отмодерировано*/ вся проблема упирается только в то, чтобы разрешить серверам пускать агенты другого сервера с выполнением на этом сервере... неужели, нету никаких расширенных настроек сервера, например в notes.ini, которые разрешат это???? :)

Проблема то чисто настроечной видится. Ну типа, как в винде - по умолчанию в windows explorer прячутся файлы системных папок, но их всегда можно отобразить по желанию и на свой страх и риск.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#12
Akupaka: Domino Add IN на жаве это интересно... только опять таки, будет ли работать синронность ? Ведь мне важно не только послать запрос на сервер2 (тоесть, вызвать агента2), но и получить ответ, в текущей сессии вызова
ну, можно ведь подключится к жава-серверу на другом сервере, отослать запрос на него и дождаться ответа... но конкретно код не дам - не знаю )

вот что вычитал на форуме ibm
You can access databases on another server, you cannot run an agent on another server unless you were using remoted Java classes, which remote the entire session and then the agent runs locally to that session... Remote Java Classes are based on CORBA
отсюда, но ничего полезного более там нет, вроде
http://www-10.lotus.com/ldd/nd6forum.nsf/5...71?OpenDocument

если не забуду, поищу завтра на интертраста, или сам поищи :) http://techforum.intertrust.ru/

lmike , мы тоскуем без твоих кросс-платформенных решений на жаве :)
 
A

AlexyeNov

#13
Akupaka: да, я тоже видел - на google это один из первых линков по проболеме.. и чуть ли не единственный (!)
Удивляет, честно говоря, что мало у кого была подобная проблема.
Кстатии, тема та ещё с 2005 года тянется, интересно вот неужели в семёрке нету положительных сдвигов с агент манагером?

Может, попробовать в c++ api что нить нарыть?
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#14
Кстатии, тема та ещё с 2005 года тянется, интересно вот неужели в семёрке нету положительных сдвигов с агент манагером?
каких сдвигов то?
какой нормальный админ согласится чтобы на его сервере дергал агенты другой сервер? :welcome:
 
A

AlexyeNov

#16
каких сдвигов то?
какой нормальный админ согласится чтобы на его сервере дергал агенты другой сервер? ;)
Админ волен соглашаться на то, что ему говорят
И неволен противоречить :welcome:
Просто получается, что всё равно функционал нужно реализовать, и всё равно будут дёргаться агенты, только делаться это будет через задницу...

И, кстати, какая принципиальная разница админу по части безопасности?

что Юзер -> RunOnServer
что Сервер -> RunOnServer

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

Кстати, ещё один нюанс.
На обоих серверах стоит Company Media. Может быть, можно через интертрастовский агент манагер прикрутить, который вроде как намного круче стандартного? :)
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#17
который вроде как намного круче стандартного
а ну ка расскажите поподробнее, что там такого крутого? :welcome:

может сделать так чтобы SAP все готовые результаты уже накидал юзеру в его сервер и сделать так чтобы юзер свой сервер не покидал вообще?
 
A

AlexyeNov

#18
а ну ка расскажите поподробнее, что там такого крутого? :welcome:

может сделать так чтобы SAP все готовые результаты уже накидал юзеру в его сервер и сделать так чтобы юзер свой сервер не покидал вообще?
По части ActiveFrame AM - хотя бы то, что там нету ограничения на запуск раз в 5 минут фоновых агентов.

ПО части SAP-а : так это и происходит, когда синхронизация идёт со стороны сервера, где стоит SAP коннектор.
Тоесть, Sap вызывает по HTTP агент на сервере с SAP коннектором, после чего агент через SAP коннектор делает запрос в SAP и получает данные, которые через файл, вставленный в rich text, кидаются на сервер, где сидит юзер и где эти данные анализируются. Приоткрою тайну - суть в синхронизации между SAP HR и Company Media, в односторонном порядке - данные HR попадают в бд СО.

Но проблема начинается, когда синхронизация инициируется со стороны синхронихируемого сервера лотуса, непонятно, как Юзеру, который не имеет права на доступ к серверу с SAP коннектором, вызвать эту самую синхронизацию принудительно - возникает ошибка, которую я описал в первом сообщении. Ведь тут как раз и нужно через двойной запуск RunOnServer это разруливать (либо по другому принципу, который пока туманен).

Обобщая:
- есть несколько филиалов CM, и есть коммуникационный Lotus сервер, который общается с SAP и получает данные по HR.
- при запуске синхронизации со стороны филиала, необходимо передать коммуникационному серверу код головной единицы филиала (посредством параметра noteid в случае использования LS agent.run,runonserver
- сихнронизация со стороны филиала инициируется юзером (а не SAP-ом), она должна быть выполнена сихронно - пользователь должен иметь результат сразу после окончания запроса...
- юзер не имеет доступа к коммуникационному серверу
- c SAP общается только комуникационный сервер, поэтому делать РАБОТАЮЩУЮ в случае наличия RFC библиотек на сервер1 конструкцию Юзер -> RunOnServer (server1) -> Run (server2) - НЕЛЬЗЯ !!!!
 

TIA

:-)
Lotus team
15.05.2009
790
3
#19
AlexyeNov
Ничего не сказали про доступ подписанта агента1 к БД на сервере2 по ACL.
 
A

AlexyeNov

#20
AlexyeNov
Ничего не сказали про доступ подписанта агента1 к БД на сервере2 по ACL.

Ну агент1 подписан сервером1, разумеется.
пробовал и юзером подписывать.

Разумеется, добавил и сервер1 и юзера в как в ACL БД на сервер2, так и в безопасность серверного документа Сервера2.
:)

Собственно, если нету в ACL, то возникает другая ошибка - "Вы не имеете права выполнять эту операцию" :welcome:
Впрочем, юзер мне всё равно не нужен в ACL - в промышленной версии у него там прав не будет..