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

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

D400

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

Задача: Позвать 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. Правда, сервер при этом не падает.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#2
сколько раз говорено...
если логика программы не предусматривает выгрузку кода (объектов) после "отработки", то такой код должен быть в lib/ext
этоже касается и сторонних jar
так работает jvm домины, безопасность тут перендикулярна
большое число хостов апдейтится в автоматическом режиме (пишем агент и задачу по перезапуску сервера)
 
D

D400

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

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 является принципиальным, прошу помочь кто чем сможет.