Giải thích URL JMX


80

Tôi đang cố gắng hiểu URL dịch vụ JMX.

service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi

Sẽ thật tuyệt nếu ai đó có thể giúp tôi hiểu điều này.

Cảm ơn


Câu trả lời:


106

Tôi sẽ sử dụng lại câu trả lời mà tôi đã viết trước đó cho câu hỏi này: Không thể kết nối với MBeanServer của Tomcat qua jconsole trong Java6

Nó không hoàn chỉnh, nhưng có thể giúp:

Giả sử bạn có Máy chủ JMX (bí danh 'JMX Agent' bí danh 'JVM mà bạn muốn kết nối với') đang chạy trên 'TARGET MACHINE' với cổng đăng ký RMI tại 'RMI REGISTRY PORT' và cổng máy chủ JMX RMI tại 'JMX RMI CỔNG MÁY CHỦ'.

Ghi chú:

  1. quan đăng ký RMI cho các máy khách JMX biết nơi tìm cổng máy chủ JMX RMI ; thông tin có thể được lấy theo khóa jmxrmi.
  2. Các cổng đăng ký RMI thường được gọi là nó được thiết lập thông qua thuộc tính hệ thống tại JVM khởi động.
  3. Các cổng máy chủ JMX RMI thường không được gọi là JVM chọn nó một cách ngẫu nhiên (nếu không có biện pháp phòng ngừa khác được thực hiện).

URI sau sẽ dẫn đến kết nối thành công (đã thử nghiệm)

service:jmx:rmi://<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi

Điều này trông khó chịu. Hãy cắt nó ra.

URI này là RFC2609 "URL giao thức vị trí dịch vụ" (tốt, nó thực sự là một URI, phải không?)

Nó bao gồm:

  • service - một hằng số
  • jmx:rmi- loại dịch vụ bao gồm: loại trừu tượng jmxlược đồ URL rmi
  • phần còn lại - sap (đặc tả giao thức truy cập dịch vụ)

nhựa cây bị phân hủy thành:

  • //<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT> - ipsite
  • /jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - Phần URL

Một ứng dụng khách JMX có đầy đủ thông tin kết nối với "ipsite" để thực hiện trao đổi JMX qua RMI; nhưng cái gì của máy khách JMX không BIẾT cổng đó? Kiên nhẫn...

Phần URL được phân tách thành:

  • /jndi/ - Điều này dường như nói với ứng dụng khách JMX rằng nó có thể nhận được thông tin tra cứu tại vị trí tiếp theo
  • rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - Đúng, chúng tôi nhận được thông tin về Máy chủ RMI JMX tại sổ đăng ký RMI, trong khóa tra cứu jmxrmi

Điều này hơi giống xe ngựa trước, vì người ta phải liên hệ với sổ đăng ký RMI được cung cấp bởi phần sau của URL SLP trước.

Sau khi vò đầu bứt tai, bằng trực giác, hãy thử:

service:jmx:rmi://<TARGET_MACHINE>/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi

Vâng, điều đó hoạt động! Cổng máy chủ JMX RMI được lấy từ sổ đăng ký. Theo suy nghĩ thứ hai, máy đích cũng nên được lấy từ sổ đăng ký, do đó:

service:jmx:rmi:///jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi

Thậm chí tốt hơn, điều đó cũng hoạt động!

Người giới thiệu:

  1. http://download.oracle.com/javase/6/docs/api/javax/management/remote/rmi/package-summary.html
  2. http://download.oracle.com/javase/6/docs/api/javax/management/remote/JMXServiceURL.html
  3. http://mx4j.sourceforge.net/docs/ch03s04.html
  4. http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdevg
  5. http://www.rfc-editor.org/rfc/rfc2609.txt

7

Giải thích:

service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi
  1. service:jmx:rmi://192.168.30.10:1234- nói rằng có JMX Agent trên máy có địa chỉ IP 192.168.30.10. Tác nhân JMX đang sử dụng (TCP) cổng 1234 để cung cấp (các) dịch vụ JMX qua RMI (về cơ bản hoạt động như một máy chủ RMI).
  2. /jndi/rmi://192.168.30.10:2344/jmxrmi - nói rằng sơ khai RMI để tương tác với JMX Agent qua RMI có thể được tìm thấy trong sổ đăng ký RMI đang chạy trên máy có địa chỉ IP 192.168.30.10 và đang sử dụng (TCP) cổng 2344. Để có được sơ khai RMI, bạn cần phải tra cứu ràng buộc "jmxrmi".

Các câu trả lời trước đây gợi ý rằng phần thứ hai của URL là để lấy cổng máy chủ của máy chủ JMX RMI. Đó là không đúng. Cổng máy chủ JMX RMI là (TCP) 1234 và là một phần của URL. Những gì bạn nhận được từ sổ đăng ký RMI là RMI sơ khai ( javax.management.remote.rmi.RMIServerImpl_Stub) mà bạn có thể sử dụng để nói chuyện với JMX Agent (MBean Server) qua RMI.

Hi vọng điêu nay co ich.


Vì bạn đang nói rằng câu trả lời của @ david-tonhofer là không chính xác, bạn có thể vui lòng giải thích cách các URL không có IP đầu tiên: cặp cổng ( 192.168.30.10:1234trong ví dụ này) hoạt động như thế nào không? tức là, các URL bắt đầu bằng service:jmx:rmi:///jndi/rmi:. Một phần lý do khiến điều này rất khó hiểu nói chung là khi chúng ta chỉ định một cổng jmx trong khi khởi động JVM, nó không tham chiếu đến RMI ở bất kỳ đâu : -Dcom.sun.management.jmxremote.port=2344. (Lưu ý rằng theo kinh nghiệm của tôi rằng cổng jmxremote được liên kết với phần "Đăng ký RMI" của URL, không phải phần "Máy chủ JMX RMI".)
erik.weathers

Có một số cách để chỉ định IP và cổng mà tác nhân JMX sẽ sử dụng. Nếu bạn muốn sửa nó thành một địa chỉ và IP cụ thể mà bạn có thể sử dụng service:jmx:rmi://192.168.30.10:1234. Ngoài ra, bạn có thể sử dụng com.sun.management.—thuộc tính. Sử dụng một URL chẳng hạn như service:jmx:rmi:///…để Java chọn IP và cổng cho bạn (ngẫu nhiên hoặc dựa trên thuộc tính hệ thống). Sử dụng một URL chẳng hạn như service:jmx:rmi://0.0.0.0:1234để liên kết cổng 1234 trên tất cả các giao diện. Và như thế. Hi vọng điêu nay co ich.
Prolancer

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.