Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Проблемы с JNI  [new]
_chaos_
Member

Откуда: Украина-Австрия
Сообщений: 198
Привет.

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

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

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 выгядит примерно следующим образом:
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 все-таки.

Что можно сделать с данной проблемой. Может быть какие-то настройки или параметры жава машины или томката?
23 мар 09, 23:06    [6966008]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5626
Отделите System.loadLibrary(SSO2TICKETLIBRARY); от класса SSO2Ticket и делайте загрузку библиотеки на событие onStart для web-приложения
23 мар 09, 23:15    [6966027]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
_chaos_
Member

Откуда: Украина-Австрия
Сообщений: 198
Kachalov,

Не получиться, библиотека очень чувствительна к названию класса в котором грузиться, то есть функция System.loadLibrary(SSO2TICKETLIBRARY), отрабатывает успешно только в классе с названием SSO2Ticket. Это конечно странно, но это факт.
23 мар 09, 23:18    [6966032]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5626
Ну проверяйте загружена она уже или нет (хотя бы флаг какой-нибудь заведите) и если не загружена то System.loadLibrary. Очевидно что происходит утечка памяти и скорее всего именно при загрузке библиотеки.
23 мар 09, 23:32    [6966061]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
_chaos_
Member

Откуда: Украина-Австрия
Сообщений: 198
Kachalov,

И с флагом делал, выносил загрузку в отдельную функцию класса SSO2Ticket в котором фиксировался флаг и каждый раз проверялся при повторной загрузки (загрузка происходит один раз). Очень сложно это оттестировать, оно вроде работает, но когда покрутится на сервере недельку, то падает.
23 мар 09, 23:37    [6966078]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5626
_chaos_,

возможно память течет в натив коде, но если с ним ничего сделать нельзя, то делайте ежедневный (в зависимости от нагрузки возможно чаще или реже) перезапуск Tomcat :(
23 мар 09, 23:44    [6966088]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
_chaos_
Member

Откуда: Украина-Австрия
Сообщений: 198
Kachalov,

Возможно, просто к эта проблема всех так запарила уже. Второй раз уже возвращаюсь к ней. Сначала делали через Java-Php-Bridge, но там модуль тоже отваливался по многим причинам (думали проблема с бриджом). Переделал по простому, проблема оказалась в библиотеке. Томкат перезапускать не вариант, так как основное нагрузочное тестирование еще не проводилось и придется его перезапускать очень часто :), а пользователей 5000. То есть нагрузка серьёзная. Объяснить что проблема в саповской натив библиотеке, будет сложно :). Начальству главное что б работало, не будет вникать в такие подробности.
23 мар 09, 23:54    [6966102]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
_chaos_
Member

Откуда: Украина-Австрия
Сообщений: 198
_chaos_,

Да и на офф форуме сапа, есть несколько бредовый статей от ихних консультантов, которые реально рекомендуют такое подход, хотя примеры которые они там выложили даже не работают, только показывают основную идею. Это говорит о том, что это все работает только теоретически, а на практике нормально оттестировать свои поделки они не удосужились.
23 мар 09, 23:58    [6966107]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5626
_chaos_
а пользователей 5000. То есть нагрузка серьёзная.

- согласен, но это можно компесировать увеличением доступной JVM памяти. Такие аргументы как "дайте денег на память" обычно доступны "начальству".

_chaos_
Объяснить что проблема в саповской натив библиотеке, будет сложно :). Начальству главное что б работало, не будет вникать в такие подробности.

- можно исхитриться, типа нативная библиотека живет в отдельной JVM откуда дергается через RMI, а уж отдельную JVM можно перезапускать хоть каждые 15 минут
24 мар 09, 00:05    [6966116]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
_chaos_
Member

Откуда: Украина-Австрия
Сообщений: 198
Kachalov,

Ну это очень извратно :).
24 мар 09, 19:21    [6970805]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
_chaos_
Member

Откуда: Украина-Австрия
Сообщений: 198
_chaos_,

Object o[] = SSO2Ticket.evalLogonTicket(ticket, "verefy.pse" , null);

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

Кстати, а вариант с JNA?
24 мар 09, 19:46    [6970862]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
_chaos_
Member

Откуда: Украина-Австрия
Сообщений: 198
Хотя нет JNA, только под Win32
24 мар 09, 20:36    [6970943]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
_chaos_
Member

Откуда: Украина-Австрия
Сообщений: 198
Все тема закрыта. У меня все работает :), это они так решили съехать на мою часть, что быть точно уверенными что проблема у них.
27 мар 09, 19:22    [6986690]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Проблемы с JNI  [new]
wilhel76
Member

Откуда:
Сообщений: 2
_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)
13 мар 19, 12:07    [21831136]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38497
wilhel76,
Может вам технологию поменять с 2009 года?
Например, у ГОСУСЛУГИ либы SSO, просто всё делают в фильтрах запроса.
13 мар 19, 12:22    [21831152]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с JNI  [new]
wilhel76
Member

Откуда:
Сообщений: 2
Спасибо. Предложим клиенту.
13 мар 19, 12:39    [21831192]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить