Подтвердить что ты не робот

Как уменьшить размер памяти объектов-заглушек Apache CXF?

В моем клиентском приложении веб-службы Apache CXF создается клиентская заглушка для разговора с несколькими веб-службами. Сгенерированные объекты-заглушки веб-службы CXF имеют достаточно большой объем памяти (10-15 объектов веб-службы занимают более 64 МБ памяти). Есть ли способ уменьшить площадь объекта CXF?

4b9b3361

Ответ 1

У нас были аналогичные проблемы с Axis. Проблема была в том, что мы хотели сделать много одновременных вызовов веб-службы, а клиенты Axis, созданные с использованием WSDL, заставили каждого клиента использовать много памяти. Клиенты arent thread safe, поэтому нам пришлось создать один клиент для каждого запроса.

У нас было два выбора. Сначала мы могли обрезать сгенерированный код, но это было не так приятно по причинам обслуживания.

Во-вторых, мы просто обрезали WSDL, чтобы удалить те части, которые не были релевантными нам, и регенерировали уменьшенные клиенты. Таким образом, если бы мы назвали один метод службы, он не будет содержать массу для несвязанных методов, которые этот поток не будет использовать.

Работал неплохо, но по-прежнему остается кошмаром в обслуживании, потому что в любое время, когда WSDL обновляется (например, наш партнер выпускает новую версию своего веб-сервиса), нам нужно потратить время на создание сокращенных wsdls. Идеальное решение, на мой взгляд, должно было бы заставить нашего партнера распознать наши проблемы и взять на себя ответственность за сокращение WSDL.

Ответ 2

Мы использовали другой подход к клиенту CXF. Я не изучал его память, что не является проблемой в нашем контексте, но это, безусловно, более простой способ разработки, чем создание заглушек. Это выглядит примерно так:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();

factory.setAddress(endpoint);
factory.getServiceFactory().setDataBinding(new AegisDatabinding());
factory.setServiceClass(myInterface.class);
Object client = factory.create();
((BindingProvider) client).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);

myInterface stub = (myInterface)client;

Мы просто делаем это (конечно, мы создали некоторые служебные классы для упрощения дальнейшего) для любого WS, с которым мы хотим подключиться во время выполнения (при условии, конечно, что у нас есть интерфейс Java). Наша цель состояла в том, чтобы сделать всю WS-вещь прозрачной для программистов, насколько это возможно. У нас действительно нет интереса к WSDL и XSD как таковым. Мы подозреваем, что мы не одиноки.

Ответ 3

Если ваши потребности в SOAP очень просты, вы можете посмотреть в kSOAP2, который действительно эффективен с точки зрения памяти. Он предназначен для работы в телефонном приложении J2ME.