В прошлой статье мы рассмотрели утечки памяти, которые возникают при остановках и переустановках веб-приложений, написанных на 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.
Чтобы создать простейшую веб-службу, требуется написать всего несколько строк кода:
@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 статей в месяц |
Уже подписан?
Читайте также
Последние новости