У меня проблемы с настройкой Tomcat для JMX.Я добавил следующие свойства в
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=18070 -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password -Dcom.sun
.management.jmxremote.ssl=false"
и добавил файл jmxremote.password в каталог conf.Я написал инструмент клиента, который подключается к серверу JMX, работающему через порт 18070. Когда я запускаю программу клиента, я получаю следующую ошибку.
Exception in thread "main" java.lang.SecurityException: Authentication failed! Credentials required
at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticationFailure(JMXPluggableAuthenticator.java:193)
at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticate(JMXPluggableAuthenticator.java:145)
at sun.management.jmxremote.ConnectorBootstrap$AccessFileCheckerAuthenticator.authenticate(ConnectorBootstrap.java:185)
at javax.management.remote.rmi.RMIServerImpl.doNewClient(RMIServerImpl.java:213)
at javax.management.remote.rmi.RMIServerImpl.newClient(RMIServerImpl.java:180)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2312)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:277)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:248)
at com.bt.c21sc.c21tkprobe.accessors.C21TkProbeJmxDAO.connect(Unknown Source)
at com.bt.c21sc.c21tkprobe.service.C21TkProbeBD.execute(Unknown Source)
at com.bt.c21sc.c21tkprobe.C21AppserverProbe.main(Unknown Source)
Если я изменю свойства CATALINA_OPTS на
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=18070 -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password -Dcom.sun
.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
, тогда все будет работать нормально.Я думаю, что меня смущает то, что классифицируется как удаленный доступ.Я запускаю клиентскую программу вне экземпляра Tomcat, но и Tomcat, и клиентский инструмент находятся на одной машине (то есть разные виртуальные машины, но с одинаковым environemnt).Я думал, что мне нужно настроить удаленную аутентификацию, если я получаю удаленный доступ к серверу JMX с другого компьютера.
Под удаленным доступом они подразумевают доступ к серверу JMX с любой виртуальной машины локально или удаленно?
Редактировать
Спасибо.Я обнаружил, что проблема была в том, что, хотя я предоставлял имя пользователя и пароль в файлах jmxremort.password и jmxremote.access, мне все равно приходилось указывать имя пользователя и пароль от клиента.
Вы правы, что мне не нужно предоставлять учетные данные пользователя, если они запускаются локально.Я доказал это, поскольку я могу получить доступ к JVM Tomcat через Jconsole.
Я обращаюсь к нему программно, поэтому мне нужно указать URL-адрес, показанный ниже службы: jmx: rmi: /// jndi / rmi: // localhost: 9004 / jmxrmi
Iполучите сервер jmx, как показано ниже.
url = new JMXServiceURL(urlString);
Hashtable<String, String[]> env = new Hashtable<String, String[]>();
String[] credentials = new String[] {user,pass};
env.put(JMXConnector.CREDENTIALS, credentials);
jmxc = JMXConnectorFactory.connect(url,env);
mbsc = jmxc.getMBeanServerConnection();
Если я получу доступ к этому локально, как мне поступить?Я знаю, что это не работает локально без учетных данных пользователя, так как я узнал, что мне нужно предоставить.если Jconsole или visualvm могут подключиться к нему, то должен быть другой подход, который позволяет получать jmx-сервер Tomcat без указания номера порта.
URL включает в себя номер порта.Если я получаю доступ к серверу JMX программно, как бы я мог получить к нему доступ без указания номера порта?
Кстати, я использую Tomcat 5.5 и JDK 1.6
Спасибо