문제

나는 현재 내 Java VM을 시작하고 있습니다 com.sun.management.jmxremote.* 관리 및 모니터링을 위해 JCONSOLE을 통해 연결할 수 있도록 속성. 불행히도 기계의 모든 인터페이스 (IP 주소)를 듣습니다.

우리 환경에는 기계에서 동시에 하나 이상의 Java VM이 실행되는 경우가 종종 있습니다. JMX에 다른 TCP 포트에서 듣도록 지시 할 수는 있지만 (사용 com.sun.management.jmxremote.port), 대신 JMX가 표준 JMX 포트를 사용하고 모든 IP 주소에 바인딩하는 것이 좋을 것입니다 (모든 것이 아닌 특정 IP 주소).

이로 인해 우리가 jconsole을 통해 어떤 VM을 연결하고 있는지 쉽게 파악할 수 있습니다 (각 VM은 자체 IP 주소를 효과적으로 소유하고 있기 때문에). JMX가 단일 IP 주소 나 호스트 이름을 듣게하는 방법을 알아 낸 사람이 있습니까?

도움이 되었습니까?

해결책

다른 사람이 이것으로 신경을 잃을 것이라면 ... 10 년 후, 그들은 마침내 그것을 고쳤다!

Java 8U102 이후 -Dcom.sun.management.jmxremote.host 선택한 IP에 바인딩합니다

보다: https://bugs.openjdk.java.net/browse/jdk-6425769

다른 팁

페르난도는 이미 링크를 제공했습니다 내 블로그 게시물 :) .. 그것은 사소하지 않습니다. 원하는 주소에 소켓을 생성하는 자신의 rmeServersocketFactoryImpl을 제공해야합니다.

내부/외부 인터페이스가 문제가되고 로컬 액세스가 있으면 로컬 방화벽을 설정하는 것이 더 쉬울 수 있습니다.

나는 이것을 시도하지 않았지만 이것은 도움이 될 수 있습니다.

여기서 주요 성가신 것은 JMX가 바인딩 할 호스트 IP 주소를 지정하는 쉬운 방법이 없다는 것입니다. 항상 모든 인터페이스에 바인딩 할 것입니다. 'java.rmi.server.hostname'속성은 작동하지 않았으며 동일한 호스트의 모든 다른 인스턴스에 대해 다른 포트를 선택하고 싶지 않았습니다.

또한, 나는 그것과 관련된 모든 복잡성으로 나만의 rmeServersocketFactory를 만들고 싶지 않았으며, 기존 코드에 대한 간단한 패치를 따랐습니다.

이 서버 소켓을 생성하는 기본 JVM RMI 소켓 공장을 패치 하여이 문제를 해결했습니다. 이제 새로운 'com.sun.management.jmxremote.host'속성을 지원합니다.

이 작업을 수행하려면 아래의 Java 코드를 Sun/RMI/Transport/Proxy/RmidirectSocketFactory.java라는 파일로 저장하십시오.

jmx_patch.jar를 컴파일하고 생성하여 Tomcat Lib/ 폴더에 넣습니다.

그런 다음 다음 줄을 bin/setenv.sh에 추가해야합니다.

classpath = $ classpath : $ catalina_home/lib/mx_patch.jar

Tomcat 인스턴스 시작 에서이 옵션을 추가하십시오

-dcom.sun.management.jmxremote.host = 192.168.100.100 "

그런 다음 JMX 서비스를 바인딩하여 192.168.100.100을 다루기 위해 만 묶습니다. 2 개의 다른 임의의 RMI 청취 포트는 여전히 모든 인터페이스에 바인딩되지만 항상 무료 포트를 선택하므로 괜찮습니다.

이제 모든 기본 포트가 손상되지 않은 단일 호스트에서 여러 개의 Tomcat 인스턴스를 실행할 수 있습니다 (예 : JMX의 경우 8080).

package sun.rmi.transport.proxy;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.server.RMISocketFactory;

public class RMIDirectSocketFactory extends RMISocketFactory {

    public Socket createSocket(String host, int port) throws IOException
    {
     return new Socket(host, port);
    }

   public ServerSocket createServerSocket(int port) throws IOException
   {
   String jmx_host = System.getProperty("com.sun.management.jmxremote.host");
   String jmx_port = System.getProperty("com.sun.management.jmxremote.port");

  // Allow JMX to bind to specific address
  if (jmx_host != null && jmx_port != null && port != 0 && integer.toString(port).equals(jmx_port)) {
    InetAddress[] inetAddresses = InetAddress.getAllByName(jmx_host);
    if (inetAddresses.length > 0) {
    return new ServerSocket(port, 50, inetAddresses[0]);
   }
}

 return new ServerSocket(port);
  }

}

방금 시도했습니다

-dcom.sun.management.jmxremote.host =

OpenJDK 1.8과 함께 잘 작동합니다. 그것은 그 addess (netstat에 따라)에 묶여 있으며 모두가 옳고 작동합니다.

받아 들여진 대답은 꽤 오래되었습니다. Java가 이제이를 가능하게하는 몇 가지 옵션을 제공한다는 몇 가지 징후가 있습니다. 예를 들어 내가 본 것 :

-Djava.rmi.server.hostname=<YOUR_IP>

...만큼 잘...

-Dcom.sun.management.jmxremote.host=<YOUR_IP>

그러나 적어도 JDK 1.7에 따라 내 시스템에서는 아무런 영향도하지 않는 것 같습니다. JMX 커넥터는 여전히 *에 바인딩됩니다. 업데이트 된 답변 (특정 해당 버전 포함)은 대단히 감사합니다. 이것 ~해야 한다 간단합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top