Следующая новость
Предыдущая новость

Java против утечек. Боремся с memory leaks в веб-службе

05.02.2018 16:35

Содержание статьи

  • Подготавливаем окружение
  • Разрабатываем SOAP-службу
  • Создаем утечки памяти
  • Утечка в Apache Tomcat
  • Утечка в GlassFish
  • Выводы

В прошлой статье мы рассмотрели утечки памяти, которые возникают при остановках и переустановках веб-приложений, написанных на Java. Речь шла о выводе логов Spring через Log4j2. Я показывал, каким образом нужно настроить веб-приложение так, чтобы контекст логгера уничтожался в последнюю очередь, после контекста Spring.

К сожалению, «весенний» фреймворк — не единственная технология, с которой могут возникнуть подобные проблемы. Сейчас я расскажу, как можно легко и просто получить утечки памяти, используя Log4j2 в веб-службах, и на этот раз конец истории будет не таким радужным.

Если ты в курсе, о чем речь, и тебе знакома эта тема, то устраивайся поудобнее и читай дальше. Если же нет, то советую сначала прочитать первую статью: она введет тебя в курс дела. Далее я буду исходить из того, что ты так и поступил. ????

Подготавливаем окружение

Если ты когда-нибудь разрабатывал веб-службы на Java, то с очень большой вероятностью использовал для этого библиотеки Metro. Обычно их даже не нужно явно подключать в проект: они могут быть установлены в контейнере сервлетов. На странице https://javaee.github.io/metro/download есть руководство по установке Metro в Apache Tomcat и GlassFish.

Установка для Tomcat довольно проста: необходимо выполнить ant-сценарий metro-on-tomcat.xml, после чего в его корневой директории в папке sharedlib появятся четыре новых файла: webservices-extra.jar, webservices-extra-api.jar, webservices-rt.jar, webservices-tools.jar, а в папке endorsed — файл webservices-api.jar. В случае с GlassFish и вовсе ничего делать не нужно: для него Metro поставляется «из коробки».

Если ты все сделал по инструкции, то мы можем приступить к разработке простой веб-службы и на ее примере изучать поведение обоих сервлет-контейнеров. Также нелишним будет заранее предупредить, дорогой читатель, что в этой статье тебя ждет на порядок более глубокое погружение в дебри «кошачьего» и «рыбьего» программного кода. Если тебя это не пугает и ты готов к сложностям, то предлагаю сварить кофе покрепче, открыть любимую IDE и погрузиться в мир Java.

Разрабатываем SOAP-службу

Чтобы создать простейшую веб-службу, требуется написать всего несколько строк кода:

@WebService(serviceName = "MyWebService") public class MyWebService {      @WebMethod     public void myWebMethod() {         // no operation     }  } 

Здесь мы объявили службу MyWebService с единственным методом myWebMethod. Создадим для нее также дескриптор развертывания sun-jaxws.xml:

<?xml version="1.0" encoding="UTF-8"?> <endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">     <endpoint name="MyWebService"                implementation="net.syberia.memoryleaks.metrolog4j2.MyWebService"                url-pattern="/MyWebService" /> </endpoints> 

С его помощью мы говорим библиотеке Metro о том, что у нас есть веб-служба под названием MyWebService, которая реализована в классе net.syberia.memoryleaks.metrolog4j2.MyWebService, и ее следует развернуть по адресу /MyWebService. Таким образом, если наше веб-приложение будет называться, к примеру, metro-log4j2-memory-leaks, то после публикации служба будет доступна по адресу http://localhost:8080/metro-log4j2-memory-leaks/MyWebService (разумеется, если сервлет-контейнер поднят на твоей локальной машине).

В Tomcat и GlassFish веб-приложения публикуются достаточно просто через административные панели в браузере. Инструкции можно найти здесь и здесь.

Работу нашей службы можно проверить, например, с помощью программы SoapUI. Если скормить ей адрес WSDL http://localhost:8080/metro-log4j2-memory-leaks-1.0/MyWebService?wsdl и отправить такой запрос:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:met="http://metrolog4j2.memoryleaks.syberia.net/">     <soapenv:Header/>     <soapenv:Body>         <met:myWebMethod/>     </soapenv:Body> </soapenv:Envelope> 

то получим ответ:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">     <S:Body>         <myWebMethodResponse xmlns="http://metrolog4j2.memoryleaks.syberia.net/"/>     </S:Body> </S:Envelope> 

Таким образом мы можем убедиться, что программа работает.

Если бы это было краткое руководство о том, как делать свои собственные службы, то на этом мы могли бы и закончить… Однако мы не ищем легких путей: нашему детищу нужно логирование! Иначе как ты будешь разбираться, почему упал продакшен в два часа ночи?

Продолжение статьи доступно только подписчикам

Cтатьи из последних выпусков журнала можно покупать отдельно только через два месяца после публикации. Чтобы читать эту статью, необходимо купить подписку.

Подпишись на журнал «Хакер» по выгодной цене!

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

1 год

5990 р.

Экономия 1400 рублей!

1 месяц

720 р.

25-30 статей в месяц

Уже подписан?

Источник

Последние новости