Какво трябва да направя, за да получа класове чрез оператор за импортиране от външни буркани в Domino Designer?

Работя с Domino сървър и разработвам java агенти. Обикновено поставям външни jar файлове в библиотеката със скриптове, но периодично получавам OutOfMemory. Извлякох jar от библиотеката със скриптове в jvm/lib/ext. Мога да получа класове чрез ClassLoader, но не мога чрез инструкция за импортиране. Какво трябва да направя, за да работи чрез импортиране?


person vexan    schedule 04.08.2012    source източник
comment
Въпрос: Какво не е наред с използването на изразите за импортиране, показани в javadoc на Domino сървъра, и оставянето на класовете в същите .jar файлове, с които са били изпратени????? Ако получавате грешки за недостиг на памет, трябва да потърсите другаде решение. Може би различни JVM превключватели, може би закупуване на повече памет, може би използване на 64-битова JVM.   -  person paulsm4    schedule 05.08.2012
comment

Имам малък проблем с динамичната промяна на динамичната тема на бутон. От друга публикация се научих да използвам:

<input type="button" data-inline="true" data-mini="true" data-theme="c" id="my-button" value="Save">
<script>
$("#my-button").buttonMarkup({ theme: 'a' }).button('refresh');
</script>

Технически това работи, докато не прекарам курсора на мишката - тогава бутонът се връща към темата за данни "c". Има ли по-добър начин за динамична промяна на темата?

  -  person vexan    schedule 05.08.2012
comment
Ако можете (лесно) да пренапишете агента в LotusScript, предлагам ви да го направите, освен ако не е сложен агент, който трябва да бъде написан на Java. Ако има някои точки, в които трябва да използвате Java, можете да използвате функционалността LS2J.   -  person D.Bugger    schedule 06.08.2012


Отговори (2)


  1. Затворете клиента и дизайнера на Lotus Notes.
  2. Поставете JAR във вашия локален jvm/lib/ext.
  3. Отворете клиента и дизайнера на Lotus Notes.

Сега можете да импортирате класовете.

person Klaus Demerath    schedule 06.08.2012

Всъщност можете изрично да добавите буркана към Java Agent. Имайте предвид, че Java Agent няма име на пакет по подразбиране и ще трябва да цитирате правилното име на пакета, когато цитирате пакета в оператора за импортиране. Импортирането на jar в агенти е описано тук, а за версия 8.5 тук и тук

Освен това подозирам, че не почиствате изрично своите java обекти. Връзката между JVM и паметта на Domino е "слаба". Така че трябва да направите свое собствено събиране на боклук на Domino обекти, за да поддържате паметта на сървъра чиста. Това все още е черна магия за мен, но моето разбиране е, че въпреки че агентите трябва да "съдържат" сесията и след това да освободят паметта при прекратяване, обектите на Domino, които не са рециклирани правилно, могат да изтощават паметта на Domino. По-долу са моите прости съвети за поддържане на паметта ви чиста:

1/ Съхранявайте обекта на сесията в обект за обвивка. Създайте клас, който има обекта на Domino session в него (нарекох го SessionWrapper). След това декларирайте обекта SessionWrapper само в рамките на метода NotesMain, не го декларирайте на ниво клас. Този клас SessionWrapper ще трябва да има свой собствен метод за рециклиране, който извиква Session.recycle(), и ще трябва да го извикате в края на NotesMain. Причината за това е обяснена в точка №2. Ако не извиквате никакви други методи в рамките на NotesMain, тогава наистина нямате нужда от тази обвивка. Вижте точка #4 относно рециклирането на сесията.

2/ Предайте SessionWrapper на всички методи, където се нуждаете от достъп до Domino. По принцип вие предавате сесията в този обвиващ клас като параметър. Това е така, защото не искаме да декларираме обекта на сесията на ниво клас. Това не е идеално, но ще предотврати изтичането на памет, причинено от поддържането на класа на сесията на ниво клас.

3/ Агресивно рециклиране. Това никога не е имало смисъл за мен, докато не видях този примерен цикъл

ViewEntryCollection vec = view.getAllEntries();
ViewEntry ve = vec.getFirstEntry();
While (ve!=null) {
 ViewEntry veNext = vec.getNextEntry(ve);
 // do stuff

 ve.recycle;
 ve = null;
 ve = veNext;
}

Вижте как обектът "ve" се рециклира и как veNext получава следващия обект. По принцип трябва да рециклирате всеки обект, след като приключите работата с него, методите "getNext" всъщност не рециклират обекта в паметта на паметта на Domino, ако не го рециклирате, той остава сирак и Domino няма да изчисти и сървърът в крайна сметка ще изчерпи паметта си за Domino обекти. Имайте предвид, че не рециклирам veNext. Не ми трябва, защото присвоявам ve => veNext. "ve" ще има връзка към същия обект на Domino и аз извиквам recycle ve в края на цикъла. От това можете да видите, че много Java обекти могат да сочат към един и същ обект на екземпляр на Domino в задната част. Ако се опитах да извикам veNext.recycle след ve.recycle, щях да получа грешка „Обектът е премахнат или рециклиран“.

4/ Повторна сесия в края на NotesMain. Уверете се, че извиквате SessionWrapper.recycle() в края на NotesMain, за да сте сигурни, че освобождавате този бит памет обратно към сървъра.

5/ Уверете се, че предоставяте достатъчно памет за JVM на сървъра. Вижте тази техническа бележка. Също така имайте предвид "HTTPJVMMaxHeapSizeSet=1", което е странна настройка, за да се гарантира, че настройките на паметта "залепват". Повече за това тук.

В продължение на много години IBM не предоставя задачите за вътрешно почистване на обекти, които са толкова отчаяно необходими, за да се премахнат тези допълнителни разходи за разработчиците. След това от вас се изисква изрично да освободите памет, което също е удар на производителността, но е необходим компромис за стабилност. Тези точки в никакъв случай не са изчерпателни, но открих, че стабилността с агенти и сървлети се подобрява значително при спазване на тези правила.

person angryITguy    schedule 05.08.2012
comment
Благодаря! Но този проблем все още съществува. Тук е написано, че трябва да използвам jvm/lib/ext папка. Предполагам, че ако jar е в библиотека със скриптове или е прикачен изрично към агент, тогава той се зарежда всеки път, когато стартирам агент и не се разтоварва. Но ако използвам jvm/lib/ext, тогава jar се зарежда само веднъж. - person vexan; 05.08.2012
comment
Добре. По отношение на използването на паметта, поставянето на буркана в агента или папката ext няма да реши проблема с паметта. Мениджърът на агента ще ги зареди в паметта със същия резултат. Поставянето на буркана в агента като ресурс улеснява поддръжката и разпространението. Въпреки това агентът продължава ли да се срива? Първоначално се надявах да реша проблема с импортирането. Изглежда обаче, че сте решили този проблем. - person angryITguy; 07.08.2012