Вызов Web Service из другого Ws

Тема в разделе "Lotus - Программирование", создана пользователем D400, 12 окт 2009.

  1. D400

    D400 Гость

    Всем доброго времени суток.

    Задача: Позвать Lotus Web Service Provider, который, в случае необходимости получения дополнительной информации, сам обратится к серверу Lotus через другой Web Service Consumer

    Задача усугубляется тем, что первый провайдер запускает несколько Thread, из которых и может производиться обращение ко второму WS. Кроме того, основной код упакован в jar и распространяется через Script Library (вариант с .../lib/ext не годится в силу того, что требуется обновление библиотеки на большом числе хостов). На сервере 8.5 эти вызовы оканчиваются полным крахом Domino. Тестирование на Local оканчивается тем же. После перезапуска предлагается отправить в IBM отчет с сообщением: ACCESS_VIOLATION

    Аналогичная схема успешно работает под TomCat 6 и Axis 1.4. Подозреваю что проблема скорее всего связана с безопасностью jvm Lotus.

    Есть ли какие-нибудь идеи как заставить связку работать и в чем могут быть грабли?

    P.S. Попытка написания тестовой связки вызовов Agent->Consumer1+Provider1->Consumer2+Provider2 также не удалась. На последнем вызове Consumer2-Proviver2 почему-то не возвращается результат и Consumer2 завершается по timeout. Правда, сервер при этом не падает.
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    сколько раз говорено...
    если логика программы не предусматривает выгрузку кода (объектов) после "отработки", то такой код должен быть в lib/ext
    этоже касается и сторонних jar
    так работает jvm домины, безопасность тут перендикулярна
    большое число хостов апдейтится в автоматическом режиме (пишем агент и задачу по перезапуску сервера)
     
  3. D400

    D400 Гость

    Всё оказалось куда запутаннее и хуже. Итак:

    1. Результат работы в данном случае не зависит от того где находится исполняемый код: в lib/ext или в Script Library или же вообще хранится в самой базе.
    2. Что касается вызова WS изнутри WS то всё работает, но есть нюанс, а именно: по-умолчанию Domino настроен так, что позволяет исполняться не более чем одному WebService одновременно. Т.е. если мы запустили WebService из из него обращаемся к WebService на том же сервере произойдет следующее:
    ws1 отправил вызов ws2 и ждет ответа
    ws2 ждет пока завершится ws1 и не стартует
    ws1 завершается с ошибкой по тайм-ауту
    ws2 стартует, делает своё дело, и отсылает ответ "в никуда".
    Стало быть, чтобы всё заработало как надо, нужно разрешить запуск более одного WS на сервере Domino.

    А теперь, собственно проблема, которую решить пока не удалось, и на помощь в которой рассчитываю:
    Если ws2 зовется не напрямую, а из нового Thread в конструкции вида:

    [codebox]public class WS1 {
    public void callWs1() {
    Thread t = new Thread() {
    ...
    public void run() {
    // вызов ws2
    new Ws2ServiceLocator().getWs2().callWs2();
    }
    };
    t.start();
    t.join(); // чтобы родитель не завершился раньше потомка, иначе тот будет просто закрыт Лотусом
    }
    }
    [/codebox]

    то всё рушится. На локале лотус просто закрывает все свои окошки. После перезапуска предлагает отправить отчет с типом ошибки ACCESS_VIOLATION
    на сервере рушится сам сервер Domino (т.е. перестаёт отвечать на запросы и требуется его перезапуск)

    Т.к. вызов из Thread является принципиальным, прошу помочь кто чем сможет.
     
Загрузка...
Похожие Темы - Вызов Web Service
  1. vincent_vega
    Ответов:
    0
    Просмотров:
    2.074
  2. imendan
    Ответов:
    13
    Просмотров:
    5.048
  3. susinmn
    Ответов:
    1
    Просмотров:
    1.990
  4. k85
    Ответов:
    0
    Просмотров:
    363
  5. alexas1
    Ответов:
    0
    Просмотров:
    509

Поделиться этой страницей