Категория > Новости > Java против утечек. Боремся с memory leaks в веб-службе - «Новости»

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


5-02-2018, 16:00. Автор: Полина

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

  • Разрабатываем SOAP-службу
  • Утечка в Apache Tomcat
  • Выводы
В прошлой?статье мы рассмотрели утечки памяти, которые возникают при остановках и переустановках веб-приложений, написанных на 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"?>

[/code]

С его помощью мы говорим библиотеке 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 и отправить такой запрос:




[/code]

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




[/code]

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


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


Источник новостиgoogle.com
Перейти обратно к новости