Что я должен сделать, чтобы получить классы через оператор импорта из внешних банок в 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
Мы используем 64-битную JVM с 4 ГБ оперативной памяти. До того, как я распаковал jar на сервер jvm/lib/ext, периодически получаю OutOfMemory после 100-200 запусков агента. Если я прикреплю библиотеку скриптов к агенту, я смогу импортировать классы с помощью оператора импорта ‹code›import org.apache.poi.POIXMLDocument‹/code›, но если я отсоединю библиотеку скриптов и извлеку jar-файлы на сервер, я не смогу получить классы через импорт заявление, поэтому я получаю ошибку компиляции и не могу скомпилировать агент. Но если я использую ClassLoader.getSystemClassLoader().loadClass(org.apache.poi.POIXMLDocument).getMethods(); я вижу все методы класса.   -  person vexan    schedule 05.08.2012
comment
Если вы можете (легко) переписать агент на LotusScript, я предлагаю вам это сделать, если только это не сложный агент, который должен быть написан на Java. Если есть моменты, когда вам нужно использовать Java, вы можете использовать функциональность LS2J.   -  person D.Bugger    schedule 06.08.2012


Ответы (2)


  1. Закройте клиент Lotus Notes и Designer.
  2. Поместите JAR в свой локальный jvm/lib/ext.
  3. Откройте клиент и конструктор Lotus Notes.

Теперь вы можете импортировать классы.

person Klaus Demerath    schedule 06.08.2012

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

Кроме того, я подозреваю, что вы явно не очищаете свои объекты Java. Связь между JVM и кучей памяти Domino "слабая". Таким образом, вы должны сделать свою собственную сборку мусора на объектах Domino, чтобы сохранить память сервера в чистоте. Для меня это по-прежнему черная магия, но я понимаю, что хотя агенты должны «удерживать» сеанс, а затем освобождать память при завершении, объекты Domino, которые не были должным образом переработаны, могут опустошать память кучи Domino. Ниже приведены мои простые советы по поддержанию памяти в чистоте:

1/ Держите объект сеанса в объекте-оболочке. Создайте класс, внутри которого находится объект сеанса Domino (я назвал его 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
в порядке. Что касается использования памяти, размещение jar в агенте или в папке ext не решит проблему с памятью. Менеджер агентов загрузит их в память с тем же результатом. Размещение банок в агенте в качестве ресурсов упрощает обслуживание и распространение. Агент все еще падает? Я изначально надеялся решить проблему импорта. Хотя, похоже, вы решили эту проблему. - person angryITguy; 07.08.2012