Привязка к сокету в Tomcat

Я пишу приложение Tomcat. В рамках своей функциональности он должен отправлять многоадресную рассылку UDP при возникновении определенных событий. Прямо сейчас мой код выглядит примерно так (хост и группа фальшивые, обработка исключений удалена для экономии места):

import java.net.*;
/* ..... */
DatagramSocket socket = new DatagramSocket(12345);
InetAddress group = InetAddress.getByName("111.222.333.444");
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 12346);
socket.send(packet);

Это отлично работает, когда я устанавливаю его в tomcat; однако, когда я пытаюсь установить новую версию приложения (используя «ant remove; ant install;»), я не могу привязаться к сокету и получаю ошибку java.net.BindException: Address already in use. Единственный выход — каждый раз перезапускать Tomcat, что явно недопустимо. Как использовать сокеты удобным для Tomcat способом?

Пара пояснений к ответу Пита:

я не закрываю сокет; он живет в синглтоне. Добавление метода, который может закрыть сокет в Singleton, и вызов его в уничтожении сервлета сработало, спасибо! Я думаю, что это немного хакерски (раскрытие такого метода миру через общедоступный метод), но он выполняет свою работу.


person SquareCog    schedule 19.03.2009    source источник
comment
Если вы только что добавили его в destroy(), это не должно быть хакерским, так как это может вызывать только контейнер сервлета (а не общедоступный, как у пользователей веб-приложения), если это то, что вы имеете в виду.   -  person Peter    schedule 19.03.2009


Ответы (1)


Вы закрываете сокет после его использования с помощью разъединения () / закрытия ()? Каков жизненный цикл сокета - на запрос или синглтон? Если это по запросу, закрытие сокета должно освободить его. Если синглтон, вам нужно как-то закрыть его при «удалении муравья» - если выключение / перезапуск Tomcat неприемлемо, то, возможно, ваш муравьиный скрипт может вызывать какую-то безопасную страницу и т. Д., Которая закрывает сокет. Если вы можете вызвать перезапуск при завершении работы, закройте сокет в методе destroy() сервлета.

person Peter    schedule 19.03.2009