Всё по отладке Java-кода в Lotus

  • Автор темы Dymytry
  • Дата начала
D

Dymytry

Граждане, как вы отлаживаете ваши Java агенты в Лотусе? И под веб, и под Нотес.

(1) Когда запускаю агент в веб то вот такой код в catch:
Код:
		PrintWriter pw = getAgentOutput();
e.printStackTrace();

pw.println("Error: " + e.getMessage());
pw.println("Error: " + e.getLocalizedMessage());

не выводит ничего и нигде ни на странице, ни в NotesLog.

(2) Мне приходится запускать тот же агент под Нотес, смотрю Java Debug Console: мои Exception e.printStackTrace пишут там ошибку, но не указывают строку...

Печаль меня одолевает!


И еще, кстати.

(3) Я ставил на компе Java SDK 1.6 , а какая версия Java у самого Лотуса? Они как бы разные и друг от друга не зависят?

(4) Если я пишу Java агент для Нотес-клиента и использую там только внутренние классы Java - агент гарантированно может быть запущен на всех машинах где стоит клиент? А если использую там внешние классы?
 
N

nvyush

Dymytry
Пользую catch(Exception e) {e.printStackTrace();}
Версия Java зависит от версии клиента, если мне не изменяет склероз 7 - 1.4, 8 - 1.5, 8.5 - 1.6
По внешним классам советую посмотреть тут: link removed
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
pw вещь контекстная
использовать его для вывода эксепшенов - не совсем корректно
проще цеплять Нотусёвую jvm и Notes.jar к эклипсу, написать свой тестовый класс и там отлаживать...
при этом не будет агентского вызова и мемберов класса - но это не большая потеря :)
 
D

Dymytry

Спасибо!
То есть строку ошибки так никто и не выводит, получается.. Тестовый класс это JUnit? Пока не добрался туда.

* * *

В продолжение, а есть ли какая-нибудь разница между выполнением java кода под веб и под нотес?

У меня вот такая текущая проблема: я создаю XML документ через DOM, при этом следующий код работает и дает результат в нотес и выдает ошибку когда агент запускается под веб:

Код:
				org.w3c.dom.Element el = xmlDocument.createElement("date");
el.setTextContent("xxx");
documentElement.appendChild(el);

Причем ошибка странная:
java.lang.NoSuchMethodError: org.w3c.dom.Element: method setTextContent(Ljava/lang/String;)V not found

Именно вот такая. В Eclipse тоже работает.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
под веб - агент исполняется на сервере, а унего м.б. др. версия жвм, в кот. этот парсер реализован по-другому
эта ошибка говорит, что метод el.setTextContent("xxx");
не реализован
 

vincent_vega

Green Team
02.04.2005
169
1
BIT
0
Есть еще такой метод


"Lotus Domino 7 разработка приложений" (3,33 MB). Пер. с англ. - страница 123.

Пару раз пытался использовать, но в 80% случаев у меня лотус сваливался, поэтому забил, но может у вас что то получится.
 
K

Kee_Keekkenen

на клиенте можно прикрутить эклипс и в ней отлаживать..
пишешь агента в лотусе, компилишь, экспортируешь код в файловую систему, настраиваешь порты (8701,8702,8703 для их применения нужна перезагрузка лотуса) в лотусе для джава дебагинга, в свойствах агента, указываешь (галка) компиляция джава кода с дебаг инфой, в эклипсе создаешь проект, в его свойствах подключаешь библиотеку Notes.jar, импортируешь в проект (default package) сохраненный ранее джава код агента..
далее запускаешь настраиваешь дебагер эклипсе, run -- debug... в закладке remote java aplication--java в поле Host высталяешь 127.0.0.1, Port 8701..
затем в эклипсе расставляешь брикпоинты, переключаешь в лотус, внем из меню акшн запускаешь агента, после этого тебя выкидывает в дебагер эклипса, а дальше уже по дебагеру лазишь..

еще пару пунктов забыл..
1.еще необходимо в notes.ini клиента прописать строку JavaEnableDebug=1
2. скопировать библиотеку dt_socket.dll из lotus\data\jvm\bin в lotus
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
эта схема работает у меня, даже в конфиге, где странно видеть её работающей ;)
конфига след.:
- нотуса 7.0.4
- wine-1.1.39
- ubuntu 9.10 64 bit
- эклипса соответственно 64бит
-Notes.jar дернул от 32бит линуховой 8.5.1, из каталога (она нужна формально - для сборки)
/opt/ibm/lotus/notes/framework/shared/eclipse/plugins/com.ibm.notes.java.api.win32.linux_1.5.1.20090929-1223
-jvm проекта - /opt/ibm/lotus/notes/jvm (тоже от 32бит версии линуховой 8.5.1)


пункт 2. (из инструкции выше) не делал (подозреваю - не для всех версий нотусей это нужно)

это просто как эксперимент проводил - потому не советую как рабочий вариант ;)

ИМХО что в такой схеме плохо - синхронизация изменений кода агента

как уже упоминал - можно "выкинуть" специфичную агенту часть и отлаживать ф-ционал, кот. необходим. Так делал с аплетом, кот. потом юзал в нотусах
придется только создавать самому сессию, и необходимые параметры передать (задать статически)
 
T

turumbay

ловля ошибок браузером
сервер, java агент:
Java:
public void NotesMain() {
    java.io.PrintWriter response = null;
    
    try {
        Session session = getSession();
        AgentContext agentContext = session.getAgentContext();
        // (Your code goes here)
        response = getAgentOutput();
        throw new Exception("але на, это я на");
    }
    catch(Exception e) { /*если оч. хочеца - можно ловить Throwable*/
        e.printStackTrace();
        if (response != null) {
            response.println("content-type:text/html");
            response.println("status:500");
            response.println("Error...");
            e.printStackTrace( response );
            response.flush();
            response.close();
    }
}
web-клиент, js: SimpleAjaxHandler
(с) Pro JavaScript™ Design Patterns. Authors: Ross Harmes, Dustin Diaz. Publisher: Apress, 2008
ISBN(s): 1430204958, 9781430204954, 159059908X, 9781590599082
JavaScript:
var SimpleAjaxHandler = function() {}; // implements AjaxHandler
SimpleAjaxHandler.prototype = {
    request : function(method, url, callback, postVars) {
        var xhr = this.createXhrObject();
        xhr.onreadystatechange = function() {
            if (xhr.readyState !== 4)
                return;
            (xhr.status === 200) ? callback.success(xhr.responseText, xhr.responseXML) : callback.failure(xhr.status , xhr.responseText);
        };
        xhr.open(method, url, true);
        if (method !== 'POST')
            postVars = null;
        xhr.send(postVars);
    },
    createXhrObject : function() { // Factory method.
        var methods = [
            function() { return new XMLHttpRequest(); },
            function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
            function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
        ];
        
        for (var i = 0, len = methods.length; i < len; i++) {
            try {
                methods[i]();
            } catch (e) {
                continue;
            }
            // If we reach this point, method[i] worked.
            this.createXhrObject = methods[i]; // Memoize the method.
            return methods[i];
        }
        // If we reach this point, none of the methods worked.
        throw new Error('SimpleHandler: Could not create an XHR object.');
    }
};
JavaScript:
var URL = "блаблабла?OpenAgent";
var callback = {
    success : function() {/*здесь нормальный поток выполнения*/},
    failure: function(status, text) { alert(text); }
}
var ajax = new SimpleAjaxHandler();
ajax.createXhrObject();
ajax.request('GET', URL, callback);
второй вариант - вернуть клиенту нормальный ответ (200), в responseText завернуть json с ошибкой:
{"errorMessage": "сюда текст ошибки"} либо сразу { throw new Error("...") } и сэвалюэтить в callback.success.
имхо второй вариант - хуже.

Добавлено:
То есть строку ошибки так никто и не выводит, получается..
Вы ловите Exception, а у вас кидается Error, который Exception-ом не являеца...
Блок catch не отрабатывает. Ловите Throwable - туда все прилетит.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
стоит тогда "расширить" объяснение

 
D

Dymytry

Интересен такой вопрос: я обнаружил, что первый запуск моего java агента проходит значительно медленнее, чем последующие!

С чем это связано?
Что тут можно поделать?

Я прочел, что у JSP похоже тоже самое: при первом запуске что-то там генериться. Может, это общее свойство серверных приложений на Java? Как улучшить?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
а первый запуск др. приложений, кот. отнимает время, Вас не смущает? :maybe:
запускается jvm, создаёт индекс библиотек...
в 8-ке - вообще всё плохо, там ещё и JIT отключён (в клиенте - точно, на сервере - не знаю)
я не знаю - есть ли ключи, кот. запустят jvm вместе с доминой, надо гугл спросить :)

кстати, вспомнил, jvm стартует вместе с http..., а вот по тормозам агентов - не знаю
 
A

ankass

Подскажите пожалуйста как в дизайнере сделать так чтобы стабильно запускался отладчик Java.
В хэлпе написана последовательность шагов, но у меня не получается запустить, раньше получалось.
В итоге выдается ошибка на картинке. Задолбало блин ))
 

Вложения

  • NoConnectJVM.JPG
    NoConnectJVM.JPG
    10,4 КБ · Просмотры: 478
A

ankass


В коде стоит
sleep(10000);

Иногда все-таки в дебаггер ворваться получается, но четкого объяснения что, зачем и как происходит я не имею.

В настоящий момент считаю так:
1. Мы из клиента запускаем например наш агент, при этом иницирируется запуск JVM, и она запущена пока мы застреваем на sleep(10000);
2. В это время идем в дизайнер и там запускаем ранее созданную конфигурацию для отладки этого агента.
3. Если все хорошо, то попадаем в отладчике на точку останова после команды sleep(10000), как написано в хэлпе, и радостно отлаживаемся.

Такая фигня работает неустойчиво у меня почему-то, трачу кучу времени.
 

Вложения

  • NoConnectJVMDetails.JPG
    NoConnectJVMDetails.JPG
    14,3 КБ · Просмотры: 412
N

nvyush

Может sleep уменьшить хотя бы до 5000? За десять секунд до отладчика можно ползком добраться.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
Как вообще в Лотусе лучше отлаживать Java-код?
есть пункт - Show Java Debug Console
рядом с Debug Lotus Script
в 8.х тоже рядом, но название м.б. другие посмотрел - такие же (тока в меню Tools, а 7-ке File->Tools)

Добавлено: шобы туды не лазить часто, я такой класс юзаю (для бриджа):
Visual Basic:
Class ErrorHandlerWJ As ErrorHandler
    Private jSession As JavaSession
    Private jError As JavaError
    
    Sub New()
        On Error Goto errorhandler
        Set jSession = New JAVASESSION
ExitFunction:
        Exit Sub
errorhandler:
        Call ErrorHandler..RaiseError()
        Resume ExitFunction
    End Sub
    
    Function RaiseError() As String
        Set jError = jSession.getLastJavaError()
        Dim es As String
        If (Len(jError.errorMsg) = 0) Then
            es = ErrorHandler..RaiseError()
        Else
            es = GetModuleInfo() + "Error at line " & Erl & ": " + jError.errorMsg
            'Print es
            jSession.ClearJavaError
        End If
        RaiseError = es
    End Function
End Class
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
lmike
Что этот код делает?:
Код:
es=ErrorHandler..RaiseError()
И ещё ламерский вопрос: как в Java-библиотеке записать код ошибки, строку, на которой она возникла, и текст ошибки, чтобы потом это всё взять в LS? Как минимум нужен нормальный текст ошибки, чтобы выдать пользователю, а для отладки желательны были бы Err и Erl, но в Java-либе.

Добавлено:
Кстати LS-класс обработки ошибок генерит такую инфу:
LS2J Error: Threw java.lang.NullPointerException
DOWNLOADFILEError at line 22: java.lang.NullPointerException
а консоль показывает такую:
Oops - an IOException happened.
java.io.FileNotFoundException: http://...
Какое сообщение тогда верно (предполагаю, что 2-е)? И как сделать, чтобы LS-класс возвращал именно 2-е сообщение?
 
Мы в соцсетях:

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