JMX RMI and Google Code Search

Рубрика: Development, Google, Java | 22 March 2007, 10:34 | juriy

Уфф, вот за что люблю свою работу, так это за те моменты, когда после длительных и изнурительных мучений кусочек кода оживает и начинает работать так как надо.

В этой заметке хочу рассказать про маленький Success Story: как я писал Hello World в стиле JMX + RMI. (Hello World’ы становятся все страшнее и страшнее). И про то, как google code search помог решить проблему в коде.


Когда появилась задача прикрутить к проекту JMX я обратился к документации Sun и нашел такую вот статейку:

Getting Started with Java Management Extensions (JMX): Developing Management and Monitoring Solutions

Сначала все шло довольно неплохо: код скомпилировался и запустился. После этого я обнаружил, что jconsole цепляться к локальному процессу не желает. Немного побродил по сети в поисках “лекарства”: так как было описано в статье – не работало, но потом махнул рукой: все равно использовать jconsole локально на production environment – извращение. Решил эту проблему через RMI, добавив несколько опций запуска приложения.

Дальше стало интереснее. Использовать встроенную поддержку JMX из JDK 5.0 было невозможно – потому что приложение “жило” на JDK 1.4.2. Поэтому инициализацию RMI коннектора необходимо было перенести в код. Но код из статьи SUN – не запускался. И вылетал с таким исключением:

java.io.IOException: Cannot bind to URL [rmi://localhost:8085/server]: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused: connect]
.......

причем и на JDK 1.5 и на 1.4.2.

Ответ я искал долго и нудно. Скажем просто – за 2 дня не нашел ничего нового (поражает количество материала по JMX – почти нет). Гуглил по названиям пакетов и Exception’у – результатов не шибко много. И те не помогли.

Сегодня решил попробовать совершенно другой способ искать ответ на свой вопрос: надо искать не решение проблемы, а рабочий код! Искать по коду можно двумя способами: Google Code Search и O’Reilly Code Search. Орейли, не помог, а вот Google как всегда выручил. По такому вот простому запросу я нашел исходник JMXRemoteServlet из поставки Tomcat 5.5.17.

После беглого просмотра кода я нашел отличия: в примере SUN не хватало пары строк:

[java]Registry reg = null;
try {
if (reg == null)
reg = LocateRegistry.createRegistry(1099);
} catch (Throwable t) {
System.out
.println((“Can’t start registry – it may be already started: ” + t));
}[/java]

После добавления строк – все заработало.

Мораль: вот вам новый способ поиска примеров кода. Вместо вбивания в google фразы вроде className example не лучше ли воспользоваться google code search?

PS о google code search я узнал из заметки Вадима за что ему отдельное спасибо

Комментариев: 2

2 Responses to “JMX RMI and Google Code Search”

Комментарии:

  1. Traut

    может не в этом проблема, но – у меня для того, чтоб заработал JMX при запуске Томката нужно было указать параметры:
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=1099
    ну и плюс флаги на authenticate и ssl

    может нет этих флагов и поэтому на порт не биндилось?

  2. juriy

    Дело в том, что эти флаги имеют смысл только для JRE 1.5 или выше. В 1.4.2 нет встроенной поддержки JMX, поэтому установка этих флагов попросту не имеет смысла.

    Если честно, то Sun’овский код я запускал на обеих JVM и с разными наборами параметров – не помогает. А после разбора кода из Tomcat – все работает. Вот теперь думаю о том, откуда взять класс javax.management.JMX, который упорно используется в примерах. А то он доступен только с 1.6.

    Кстати, если у кого-то есть материалы про JMX (только _нормальные_ материалы) – делитесь.

Leave a Reply