Проблема Java валит Domino на Win (очень странная тема)

caramp

New member
07.04.2020
2
0
BIT
0
Всем привет!

Ситуация: есть старенький сервер Domino 8.5 на Win Server 2003 из непереживущей карантин фирмы.
Хотелось бы вытащить из него скопившееся добро, жалко если пропадет :)
Полистал интернет, почитал help дезайнера и... попробовал написать программу Java, которую запускаю локально на сервере.
Программа ничего особенного не делает - не выходит за рамки help'a, не лезет куда нельзя...

public class MyLotus extends NotesThread {

public static void main(String argv[])
{
MyLotus mySample = new MyLotus();
mySample.start();
}

public void runNotes() throws NotesException{

Session s = NotesFactory.createSession();

DbDirectory dbdir = s.getDbDirectory("");

Database db = dbdir.getFirstDatabase(DbDirectory.DATABASE);

while (db != null) {

if(!db.isOpen()){
db.open();
}

get_db_data(db);

db.recycle();

db=dbdir.getNextDatabase();
}

s.recycle();

}

private void get_db_data(Database db) throws NotesException{

System.out.println("Database title " + db.getTitle());

DocumentCollection dc = db.getAllDocuments();
System.out.println("Documents count: " + dc.getCount());

int n = 0;
Document doc = dc.getFirstDocument();
while (doc != null) {
n++;
Vector Items=doc.getItems();

for (int j=0; j<Items.size(); j++) {
Item item = (Item)Items.elementAt(j);
System.out.println("Doc #" + n + ": NoteId " + doc.getNoteID() + ", item_name " + item.getName() + ", item_value " + item.getValueString());
}
doc = dc.getNextDocument();
}

}


}

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

Может, дело в том, что надо как-то авторизовываться?
Но ни никаких сообщений об этом не появлялось.
Что еще...
При компиляции цепляю Notes.jar из какой-то папки Domino.

Подскажите, куда рыть, где искать?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
Программа ничего особенного не делает
что она должна делать?
Эксперименты с NotesThread вполне могут уронить сервер
тем паче - в коде запускается "клиентское" приложение, параллельно с сервером домины - это архтектурная "крамола" и она работает только на винде
удивляться падению сервера, в таком виде, не стоит ;)
в агенте (если использовать его) сессия уже есть и получать её не нужно
для работы через Java с доминой, на сервере, есть DominoJNA кроссплатформенное ПО, я его запускал на сервере (линукс), сервер тоже ронял (стечение обстоятельств и именно с тредами)
Вывод - использование java, для работы с доминой (серверной частью), предполагает либо агенты, либо стэк JSF (более гибко)
В этих случаях риск уронить сервак меньше (хотя можно - по памяти)
JNA замечательный проект, но нужно чётко понимать риски (там идут вызовы CAPI)
 

caramp

New member
07.04.2020
2
0
BIT
0
Добрый день! Вопрос по-прежнему актуален, просто приболел немного.

Чего-то я не понял... Зачем писать агенты для того, чтобы вытащить с сервака "скопившееся добро"?

Это не агент, это отдельная программа. Я не очень разбираюсь в Лотусе, больше в разработке, но, по-моему, агента можно написать только с помощью Дезайнера.
Дезайнера у меня нет и, по правде говоря, ставить его на сервер я боюсь из принципа "работает-не трогай".

Вижу в вашем коде кучу архитектурных ошибок. Это можо долго обсуждать. Но мне кажется в целом концепция не верна. Влад задал правильный вопрос. "А на паркуа?"
Прошу указать на архитектурные ошибки, буду рад их исправить.
Идея в том, что бы документы уволенных сотрудников, которые хранятся сейчас внутри сервера, вытащить и удобно сложить в папки на Рабочем столе.
Желательно, не в кучу, а с осмысленными именами. И забыть про Лотус-Домино :)
Почему на Java? Примеров кода более чем достаточно, осталось только немного допилить.

для работы через Java с доминой, на сервере, есть DominoJNA кроссплатформенное ПО, я его запускал на сервере (линукс), сервер тоже ронял (стечение обстоятельств и именно с тредами)
Спасибо за ссылку на DominoJNA! Почему-то не попадалось, изучаю...
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
45
"Идея в том, что бы документы уволенных сотрудников, которые хранятся сейчас внутри сервера, вытащить и удобно сложить в папки на Рабочем столе.
Желательно, не в кучу, а с осмысленными именами. И забыть про Лотус-Домино "
1 плохая идея: доки, этаж не плоский текст, надо будет вменяемо отдизайнить в ртф, хатя бы, а формы то разные. И, потом, это действие, по сути, конвертация БД Домино в БД ФС
2 Ставить JNA без дизайнера - так себе идея)
3 дизайнер и не надо ставить на сервер...
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
Это не агент, это отдельная программа. Я не очень разбираюсь в Лотусе, больше в разработке, но, по-моему, агента можно написать только с помощью Дезайнера.
Дезайнера у меня нет и, по правде говоря, ставить его на сервер я боюсь из принципа "работает-не трогай".
Дизайнера надо поставить себе на свой рабочий комп. Вместе с ним получите ещё неплохой Help. Без дизайнера тоже можно, но надо уметь настроить рабочее место в Eclipse. В IDEA это сделать по-моему вообще не удастся, т.к. она для проекта обязательно требует JDK, а вас есть только JRE от Domino и это не тоже самое, что Oracle JDK.

Прошу указать на архитектурные ошибки, буду рад их исправить.
Идея в том, что бы документы уволенных сотрудников, которые хранятся сейчас внутри сервера, вытащить и удобно сложить в папки на Рабочем столе.
Желательно, не в кучу, а с осмысленными именами.
Документом в Лотусе называется запись в базе. Вы, очевидно, имеете ввиду файлы-аттачменты? На самом деле в Лотусовой базе "Библиотека документов" файлы хранить удобнее и искать легче, чем в файловой системе.

Есть много тонкостей по написанию Java кода для Domino.
1. Session s = NotesFactory.createSession(); - создаёт сессию дял пользователя по-умолчанию, для того чей ID-файл прописан в notes.ini (если вы это запускаете на сервере, подозреваю, что у вас там вообще ничего такого не прописано). Поэтому для вашей сессии надо указать имя пользователя и его пароль. Естественно, пользователь должен иметь доступ ко всем документам в базе, в Лотусе с этим строго, права администратора базы ещё ничего не значат в плане доступа к документам базы.
2.
DbDirectory dbdir = s.getDbDirectory("");
Database db = dbdir.getFirstDatabase(DbDirectory.DATABASE);

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

Всё Java API - это всего лишь обёртка над C API, поэтому все классы lotus.domino.* не собираются явовским сборщиком мусора и поэтому все объекты, которые вы создаёте, необходимо "уничтожать" самостоятельно, через вызов recycle(), особенно для объектов, которые вы создаёте в цикле, иначе переполнение памяти вам обеспечено. У вас там в цикле item и doc.

3. item.getValueString() - работает только для текстовых полей.

Ну это так по-мелочам. Думаю, если бы у вас было больше кода, то и замечаний могло бы быть значительно больше.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
Идея в том, что бы документы уволенных сотрудников, которые хранятся сейчас внутри сервера, вытащить и удобно сложить в папки на Рабочем столе.
странное желание - переложить поиск и контроль с сервера на ФС (учитывая убогую индексацию в винде), а почему не делегировать права др. сотрудникам - домина предполагает права на уровне документа (Readers|Authors)
Доступ с домине вполен можно осуществлять через http, вариантов несколько и тогда - можно использовать просто java с разборром результата с пом. json
почитайте Унификация разработки
авторизацию можно "упростить" если использовать $WSRU , но надо защищать периметр (ограеничение доступа к хосту для такой авторизации)

2 Ставить JNA без дизайнера - так себе идея)
ну не знаю - зачем там дизигнер будет нужен, вполне standalone робит, ток использолвать надо будет эклипс (@garrick упоминал JDK для IDEA)
 
Мы в соцсетях:

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