Содержание статьи
К сожалению, «весенний» фреймворк — не единственная технология, с которой могут возникнуть подобные проблемы. Сейчас я расскажу, как можно легко и просто получить утечки памяти, используя Log4j2 в веб-службах, и на этот раз конец истории будет не таким радужным.
Если ты в курсе, о чем речь, и тебе знакома эта тема, то устраивайся поудобнее и читай дальше. Если же нет, то советую сначала прочитать первую статью: она введет тебя в курс дела. Далее я буду исходить из того, что ты так и поступил. 🙂
Подготавливаем окружение
Если ты когда-нибудь разрабатывал веб-службы на Java, то с очень большой вероятностью использовал для этого библиотеки Metro. Обычно их даже не нужно явно подключать в проект: они могут быть установлены в контейнере сервлетов. На странице https://javaee.github.io/metro/download есть руководство по установке Metro в Apache Tomcat и GlassFish.
Установка для Tomcat довольно проста: необходимо выполнить ant-сценарий metro-on-tomcat.xml
, после чего в его корневой директории в папке shared\lib
появятся четыре новых файла: 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>
Таким образом мы можем убедиться, что программа работает.
Если бы это было краткое руководство о том, как делать свои собственные службы, то на этом мы могли бы и закончить… Однако мы не ищем легких путей: нашему детищу нужно логирование! Иначе как ты будешь разбираться, почему упал продакшен в два часа ночи?
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»