✔Java против утечек. Боремся с memory leaks в веб-службе - «Новости»
Содержание статьи
- Разрабатываем SOAP-службу
- Утечка в Apache Tomcat
- Выводы
К сожалению, «весенний» фреймворк — не единственная технология, с которой могут возникнуть подобные проблемы. Сейчас я расскажу, как можно легко и просто получить утечки памяти, используя 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