Jar, агент

Z

zum

+1) аналгично
Как я понял сессия мрет вместе с завершением агента...
Тоесть получаеться агент запускает прогу, передает параметры все гуд.
Затем он закрываеться и и вместе с ним сессия. А приложение остаеться висеть... токо уже с мнимой сессией.
Надо как его удержать агент, до закрытия приложения токо как это сделать пока не знаю...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 981
611
BIT
439
именно на это вы и напоролись :)
и потому - получайте сразу юнид дока (в конструкторе, из сессии...) а уж по нему, сами получаете обект
Либо сразу получаете из сессии док (хотя это м.б. менее "устойчиво"), но думаю сработает

+1) аналгично
Как я понял сессия мрет вместе с завершением агента...
Тоесть получаеться агент запускает прогу, передает параметры все гуд.
Затем он закрываеться и и вместе с ним сессия. А приложение остаеться висеть... токо уже с мнимой сессией.
Надо как его удержать агент, до закрытия приложения токо как это сделать пока не знаю...
не надо держать агент - плюньте на него, сами создавайде нотусёвые объекты, из исходных данных

это как раз плюс - долгоживучесть свинговых объектов, все кто используют LS "мучаются" с обходом "времени жизни" и неглобальности :)
изобретают костыли различные, а здесь родной механизм...
 
Z

zum

потому - получайте сразу юнид дока (в конструкторе, из сессии...) а уж по нему, сами получаете обект
Либо сразу получаете из сессии док (хотя это м.б. менее "устойчиво"), но думаю сработает
Это как?
передовать в проеэкт UNID?
и создавать новую сессию уже в проэкте??
не понял запутался...

У меня передаеться сессия, и сразуже создаеться локальная переменная doc - документ, от сессии.
Он не пустой я с него все параметры беру...
Но как агент завершаетьсься поля документы уже не доступны.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 981
611
BIT
439
брать надо String unid=doc.UniversialID
и сохранять его
потом получать из БД
сессию получать заново (через Factory)
Session ses=NotesFactory.createSession();
нужен unid, ибо коды агент отработает, объекта базы тоже не будет
String id = agentContext.getCurrentDatabase().getReplicaID();
и имя сервера
String server=ses.getServerName();

потом получать Database db = session.getDatabase(null, null);
if (db.openByReplicaID(server, id)){
....
Document doc = db.getDocumentByUNID(unid);
}

и воще всё это есть в хэлпе
 
Z

zum

сделал <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"><!--shcode--><pre><code class='java'>public void FCon(String UNID) {
try {
S = NotesFactory.createSession();
agentContext = S.getAgentContext();
String id = agentContext.getCurrentDatabase().getReplicaID();
String server = agentContext.getCurrentDatabase().getServer();
System.out.println("doc UNID=" + UNID);
System.out.print("\n id=" + id + "\nserver=" + server);
System.out.print("\n 2db=" + agentContext.getCurrentDatabase().getFileName());
db = S.getDatabase(null, null);
if (db.openByReplicaID(server, id)) {
doc = db.getDocumentByUNID(UNID);
}
}
}[/CODE]Ситуация такая же. Пока есть агент есть докумен нет агента, нет документа...

При записи выдает:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">NotesException: Object has been removed or recycled</div></div><div class="sp-body"><div class="sp-content"> at lotus.domino.local.NotesBase.CheckObject(Unknown Source)
at lotus.domino.local.Document.replaceItemValue(Unknown Source)
если же пробовать
<!--shcode--><pre><code class='java'>String server = S.getServerName();[/CODE]
то возвращает пустую строку.
 
N

nvyush

Добавил в конструктор класса редактора строки:
<!--shcode--><pre><code class='java'>AgentContext agentContext = argSession.getAgentContext();
Document document = agentContext.getDocumentContext();
documentUNID = document.getUniversalID();
dbid = agentContext.getCurrentDatabase().getReplicaID();
server = argSession.getServerName();[/CODE]где argSession - параметр конструктора; documentUNID, dbid, server - свойства класса (тип - String)

В кнопке сохранения добавил строки:
<!--shcode--><pre><code class='java'>NotesThread.sinitThread();
Session session = NotesFactory.createSession();
Database db = session.getDatabase(null, null);
if (db.openByReplicaID(server, dbid)) {
Document document = db.getDocumentByUNID(documentUNID);
document.replaceItemValue("TableData", dataString);
document.save(true, true);
}[/CODE]
Работает :wacko:
 
Z

zum

все понял где ошибся!
Тож все заработало. :)
А есть метод позволяющий закрыть текщий документ? Поискал не нашел... может его нет вообще?
 
N

nvyush

все понял где ошибся!
Тож все заработало. :)
А есть метод позволяющий закрыть текщий документ? Поискал не нашел... может его нет вообще?
Java с лотусовой уёй не работает. Закрыть документ можно перед вызовом java-агента
Я сейчас попробовал открыть отредактированный в java-окне документ вызовом LS-агента с соответствующим NoteId. Открывать-то он открывает но Лотус виснет намертво. Думаю, как побороть и стоит ли.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 981
611
BIT
439
не стоит смешивать нити jvm и Нотусей, у Нотусёвого клиента очень "плохо" с мультитредовостью...
очередное "спасибо" гуёвым индусописюнам :)

рулите в обратную сторону - вызываайте java гуй из LS2J, учитывая, что в свинговом объекте можно реализовать синглтон и прятать окна (а не дестроить), получим гибкую надстройку над "убогим" гуём
 
Z

zum

В продолжении темы =)
Как все это во внешнюю библу вынести? Чтобы нотус его видел.
Где пути указать? Notes.ini?
 
Z

zum

Нет это как раз не внешняя это внутреняя
для доверенный библиотек
А если хочеться в другое место? Например, отдельная папка на диске.
 
Y

Yakov

Параметры JavaUserClasses и JavaUserClassesExt в notes.ini. Нашел в гугле по фразе "notes.ini classpath".
 
Z

zum

Еще момент обьясните пожалуста никак не пойму...

положил в каталог сервера Domino
Domino\jvm\lib\ext\ свой*.jar. перегрузил сервер
Однако в дизайнере классы jar не доступны...
ClassNotFoundException
Что не так делаю?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 981
611
BIT
439
смущает слово сервер :D
разработка на сервере и запуск его клиентской проги nlnotes.exe?
jar должен лежать "там" - где ведется разработка или использование
 
Z

zum

Я думал если положить на сервер, то классы будут доступны и на клиентах...

прочитал вот это:
"5. В каталог сервера Domino Domino\jvm\lib\ext\ (или же локальный каталог Notes\jvm\lib\ext\) скопируйте нужный jdbc драйвер. Например, для DB2 – db2jcc.ja, для Oracle - ojdbc14.jar. После добавления файла необходимо перегрузить сервер (или клиент).
6. Если необходимо выводить результат в виде графиков необходимо скопировать дополнительные библиотеки в каталог библиотек java - Domino\jvm\lib\ext\ (или же локальный каталог Notes\jvm\lib\ext\):"
Разработка форумчанина "SQL Explorer"

"jar должен лежать "там" - где ведется разработка или использование"
те по любому надо тащить jar на клиента без вариантов?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 981
611
BIT
439
угу
на серверре он нужен только для серверного использования (агент исполняется ранонсервер или "из веб")
я уже упоминал... - берём базу, прифигачиваем к ней вложения (в любой док, jar), при запуске агента проверяем загрузку класса, кот. есть в jar (как вариант), по эксепшн - вываливаемся в ф-цию, кот. детачит jar, на диск
String jpath=System.getProperty("java.home");
String fsep=System.getProperty("file.separator");
String libpath=jpath+fsep+"lib"+fsep+"ext"+fsep; //путь подправил
и в этот libpath детачим либу
собсна фсё
сопутствующие переменные:


ловля на эксепшн:
Код:
		try {
Class o = Class.forName("имя класса из jar");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
... зовём ф-цию детача
... просим передернуть клиента
}
 
Z

zum

В продолжении темы =)
Столкнулся с такой проблемой...
Опишу вкратце...

Раньше было, как nvy писал здесь.

То есть сначала в агент передавалась сессия, с нее выгр*цензура*ись все нужные параметры, для того чтобы поднять ее заново
по кнопке сохранить... А при попытке создать сессию из программы до того как отвалится лотусовая, все очень печально заканчиваются, обычно зависание.
Дак как же обойти этот геморой? Надоело ловить момент падения первой сессии... и момент поднятия новой.

Так например а если в программке будет допустим 10 кнопок сохранить и еще 10 других елементов,на собития которых нужно из лотуса данные тянуть...
Как быть? Наверно выше описанный способ не единственный и не самый верный?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 981
611
BIT
439
код нужен - кот. не работает... (вместе с формой)
агентский тред можно убивать насильственно (ежели склероз не врёт)
 
Z

zum

код выше =)
просто там флаг добавлен чтоб кучу раз сессию не делать

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

дак как там ее насильственно убить?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!