• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

  • Мобильный клиент нашего форума для Android гаджетов доступен в Google Play Market по этой ссылке. Клиент можно скачать с нашего форума по этой ссылке. Последняя версия МК в нашем телеграм канале вот здесь

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

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

Dymytry

#1
Граждане, как вы отлаживаете ваши 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 - агент гарантированно может быть запущен на всех машинах где стоит клиент? А если использую там внешние классы?
 

nvyush

Lotus team
22.04.2009
2 317
0
#2
Dymytry
Пользую catch(Exception e) {e.printStackTrace();}
Версия Java зависит от версии клиента, если мне не изменяет склероз 7 - 1.4, 8 - 1.5, 8.5 - 1.6
По внешним классам советую посмотреть тут: Jar агент
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 663
295
#3
pw вещь контекстная
использовать его для вывода эксепшенов - не совсем корректно
проще цеплять Нотусёвую jvm и Notes.jar к эклипсу, написать свой тестовый класс и там отлаживать...
при этом не будет агентского вызова и мемберов класса - но это не большая потеря :)
http://www-01.ibm.com/support/docview.wss?...uid=swg21188789
 
D

Dymytry

#4
Спасибо!
То есть строку ошибки так никто и не выводит, получается.. Тестовый класс это 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
6 663
295
#6
под веб - агент исполняется на сервере, а унего м.б. др. версия жвм, в кот. этот парсер реализован по-другому
эта ошибка говорит, что метод el.setTextContent("xxx");
не реализован
 
02.04.2005
170
1
#7
Есть еще такой метод

http://www.ibm.com/developerworks/ru/doc/l...;S_CMP=SIMPLERS
"Lotus Domino 7 разработка приложений" (3,33 MB). Пер. с англ. - страница 123.

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

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#8
на клиенте можно прикрутить эклипс и в ней отлаживать..
пишешь агента в лотусе, компилишь, экспортируешь код в файловую систему, настраиваешь порты (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
6 663
295
#9
эта схема работает у меня, даже в конфиге, где странно видеть её работающей ;)
конфига след.:
- нотуса 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. (из инструкции выше) не делал (подозреваю - не для всех версий нотусей это нужно)

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

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

как уже упоминал - можно "выкинуть" специфичную агенту часть и отлаживать ф-ционал, кот. необходим. Так делал с аплетом, кот. потом юзал в нотусах
придется только создавать самому сессию, и необходимые параметры передать (задать статически)
 
13.03.2009
625
1
#10
ловля ошибок браузером
сервер, 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:<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">SimpleAjaxHandler</div></div><div class="sp-body"><div class="sp-content">
(с) Pro JavaScript™ Design Patterns. Authors: Ross Harmes, Dustin Diaz. Publisher: Apress, 2008
ISBN(s): 1430204958, 9781430204954, 159059908X, 9781590599082
Код:
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.');
}
};
Код:
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 - туда все прилетит.
 
D

Dymytry

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

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

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 663
295
#13
а первый запуск др. приложений, кот. отнимает время, Вас не смущает? :maybe:
запускается jvm, создаёт индекс библиотек...
в 8-ке - вообще всё плохо, там ещё и JIT отключён (в клиенте - точно, на сервере - не знаю)
я не знаю - есть ли ключи, кот. запустят jvm вместе с доминой, надо гугл спросить :)

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

ankass

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

Вложения

A

ankass

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

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

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

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

Вложения

nvyush

Lotus team
22.04.2009
2 317
0
#17
Может sleep уменьшить хотя бы до 5000? За десять секунд до отладчика можно ползком добраться.
 

lmike

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

Добавлено: шобы туды не оазить часто, я такой класс юзаю (для бриджа):
Код:
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 (jError.errorMsg = "") 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 306
11
#19
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-е сообщение?
 

nvyush

Lotus team
22.04.2009
2 317
0
#20
Для LS2J можно использовать подобную обработку ошибок:
Код:
Function SomeFunction(param As String) As String
'запрос к web-сервису
On Error Goto ErrorHandler
On Error 318 Goto Error318

Dim jSession As JavaSession
Dim jClass As JavaClass
Dim jMethod As JavaMethod
Dim jError As JavaError
Dim jErrorStackTrace As String

Set jSession = New JavaSession()
Set jClass = jSession.GetClass("SomePackage/SomeClass")
Set jMethod = jClass.GetMethod("SomeMethod", "(Ljava/lang/String;)Ljava/lang/String;")
SomeFunction = jMethod.Invoke(, param)
Exit Function
Error318:
Set jError = jSession.getLastJavaError()
jErrorStackTrace = jError.StackTrace
Call jSession.ClearJavaError()
ErrorHandler:
msgbox Error + chr$(10) + jErrorStackTrace + chr$(10) + "line: " + cstr(erl)
End Function
 
Вверх Снизу