Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с JNI / 16 сообщений из 16, страница 1 из 1
23.03.2009, 23:06
    #35886911
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
Привет.

Возникает проблема. Есть Single Sign On модуль, которые используется для парсинга тикета SAP-а. Потом результат работы этого модуля используется для авторизации в другой системе.

Модуль представляет собой класс SSO2Ticket:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
 public   class  SSO2Ticket
{
     public   static   final   int  ISSUER_CERT_SUBJECT =  0 ;
     public   static   final   int  ISSUER_CERT_ISSUER =  1 ;
     public   static   final   int  ISSUER_CERT_SERIALNO =  2 ;
		
     public   static  String SECLIBRARY ;
     public   static  String SSO2TICKETLIBRARY = "sapssoext";    
    
     static  {
         if  (System.getProperty("os.name").startsWith("Win"))  {
            SECLIBRARY = "sapsecu.dll";
        }  else  {
            SECLIBRARY = "libsapsecu.so";
        }
        System.loadLibrary(SSO2TICKETLIBRARY);
         if (!init(SECLIBRARY)) {            
            System.out.println("Could not load library: " + SECLIBRARY);
            System.exit(- 1 );            
        }			            
    }

    
     private   static   native   synchronized   boolean  init(String seclib);
    
     public   static   native   synchronized  Object[] evalLogonTicket(
        String ticket,
        String pab,
        String pab_password)
         throws  Exception;    
}


Модуль завернут в сервелт, который принимает в параметры ticket, парсит его и выводит в поток логин авторизированного пользователя. Другая система вызывает сервлет с параметром ticket, в поток получает логин, авторизированного пользователя.

GetTicketServlet выгядит примерно следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public   class  GetTicketServlet  extends  HttpServlet
{
     public   static   void  doService(HttpServetRequest req, HttpServletResponse res) {
        String ticket = req.getParameter("ticket");
        Object o[] = SSO2Ticket.evalLogonTicket(ticket, "verefy.pse" ,  null );
        res.getWriter().pritnln(o[ 0 ]); // Login id
    }
}


В общем схема такова (исходники писал на коленках). Это все работает под tomcat. Но периодически при нагрузке все слетает. То есть при каждом запуске данного сервлета память занимаемая JVM наростает и доходит до придела и слетает. Все работает под linux ubuntu 64 разряда, jdk sun 1.6.

Я не понимаю в чем может быть проблема. Библиотека вроде грузить один раз, а потом только отрабатывает функция evalLogonTicket. Работоспособность функции как бы тоже внушает доверие JNI SAP все-таки.

Что можно сделать с данной проблемой. Может быть какие-то настройки или параметры жава машины или томката?
...
Рейтинг: 0 / 0
23.03.2009, 23:15
    #35886924
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
Отделите System.loadLibrary(SSO2TICKETLIBRARY); от класса SSO2Ticket и делайте загрузку библиотеки на событие onStart для web-приложения
...
Рейтинг: 0 / 0
23.03.2009, 23:18
    #35886927
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
Kachalov,

Не получиться, библиотека очень чувствительна к названию класса в котором грузиться, то есть функция System.loadLibrary(SSO2TICKETLIBRARY), отрабатывает успешно только в классе с названием SSO2Ticket. Это конечно странно, но это факт.
...
Рейтинг: 0 / 0
23.03.2009, 23:32
    #35886952
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
Ну проверяйте загружена она уже или нет (хотя бы флаг какой-нибудь заведите) и если не загружена то System.loadLibrary. Очевидно что происходит утечка памяти и скорее всего именно при загрузке библиотеки.
...
Рейтинг: 0 / 0
23.03.2009, 23:37
    #35886964
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
Kachalov,

И с флагом делал, выносил загрузку в отдельную функцию класса SSO2Ticket в котором фиксировался флаг и каждый раз проверялся при повторной загрузки (загрузка происходит один раз). Очень сложно это оттестировать, оно вроде работает, но когда покрутится на сервере недельку, то падает.
...
Рейтинг: 0 / 0
23.03.2009, 23:44
    #35886971
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
_chaos_,

возможно память течет в натив коде, но если с ним ничего сделать нельзя, то делайте ежедневный (в зависимости от нагрузки возможно чаще или реже) перезапуск Tomcat :(
...
Рейтинг: 0 / 0
23.03.2009, 23:54
    #35886981
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
Kachalov,

Возможно, просто к эта проблема всех так запарила уже. Второй раз уже возвращаюсь к ней. Сначала делали через Java-Php-Bridge, но там модуль тоже отваливался по многим причинам (думали проблема с бриджом). Переделал по простому, проблема оказалась в библиотеке. Томкат перезапускать не вариант, так как основное нагрузочное тестирование еще не проводилось и придется его перезапускать очень часто :), а пользователей 5000. То есть нагрузка серьёзная. Объяснить что проблема в саповской натив библиотеке, будет сложно :). Начальству главное что б работало, не будет вникать в такие подробности.
...
Рейтинг: 0 / 0
23.03.2009, 23:58
    #35886984
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
_chaos_,

Да и на офф форуме сапа, есть несколько бредовый статей от ихних консультантов, которые реально рекомендуют такое подход, хотя примеры которые они там выложили даже не работают, только показывают основную идею. Это говорит о том, что это все работает только теоретически, а на практике нормально оттестировать свои поделки они не удосужились.
...
Рейтинг: 0 / 0
24.03.2009, 00:05
    #35886990
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
_chaos_а пользователей 5000. То есть нагрузка серьёзная.
- согласен, но это можно компесировать увеличением доступной JVM памяти. Такие аргументы как "дайте денег на память" обычно доступны "начальству".

_chaos_Объяснить что проблема в саповской натив библиотеке, будет сложно :). Начальству главное что б работало, не будет вникать в такие подробности.
- можно исхитриться, типа нативная библиотека живет в отдельной JVM откуда дергается через RMI, а уж отдельную JVM можно перезапускать хоть каждые 15 минут
...
Рейтинг: 0 / 0
24.03.2009, 19:21
    #35889399
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
Kachalov,

Ну это очень извратно :).
...
Рейтинг: 0 / 0
24.03.2009, 19:46
    #35889452
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
_chaos_,

Код: plaintext
1.
Object o[] = SSO2Ticket.evalLogonTicket(ticket, "verefy.pse" ,  null );

Возможно это массив не освобождается. И стоит его добавить результат в WeakReference, а потом очистить и обнулить и вызвать gc.

Кстати, а вариант с JNA?
...
Рейтинг: 0 / 0
24.03.2009, 20:36
    #35889517
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
Хотя нет JNA, только под Win32
...
Рейтинг: 0 / 0
27.03.2009, 19:22
    #35897385
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
Все тема закрыта. У меня все работает :), это они так решили съехать на мою часть, что быть точно уверенными что проблема у них.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
13.03.2019, 12:07
    #39785284
wilhel76
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
_chaos_, добрый день!
Появилась задача по этому классу. Вопрос по использованию его в php-bridge. Может помните, у вас не было проблем с обнаружением библиотек libsapcrypto.so и libsapssoext.so?
У нас ошибка, с которой не знаем что делать. Библиотеки скопированы куда только можно. Также есть внутри jar файла, который скопирован внутрь /usr/share/tomcat/webapps/JavaBridge/WEB-INF/lib
Logon ticket available Warning: Unchecked exception detected: [[o:Response$UndeclaredThrowableErrorMarker]:"FATAL: Undeclared java.lang.RuntimeException detected. java.lang.Exception: Invoke failed: [[o:SSO2Ticket]]->getStringVersion. Cause: java.lang.UnsatisfiedLinkError: SSO2Ticket.getStringVersion()Ljava/lang/String; VM: 1.6.0_41@ http://java.sun.com/" at: #-11 SSO2Ticket.getStringVersion(Native Method)
...
Рейтинг: 0 / 0
13.03.2019, 12:22
    #39785293
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
wilhel76,
Может вам технологию поменять с 2009 года?
Например, у ГОСУСЛУГИ либы SSO, просто всё делают в фильтрах запроса.
...
Рейтинг: 0 / 0
13.03.2019, 12:39
    #39785314
wilhel76
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с JNI
Спасибо. Предложим клиенту.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с JNI / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]