2010-05-04 34 views
58

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

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

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

Cảm ơn

+0

Liên quan đến http://stackoverflow.com/questions/743343/cannot-connect-to-tomcats-mbeanserver-via-jconsole-in-java6 – Gray

Trả lời

88

tôi sẽ sử dụng lại một câu trả lời tôi đã viết lên trước cho câu hỏi này: Cannot connect to Tomcat's MBeanServer via jconsole in Java6

Đó là chưa hoàn chỉnh , nhưng có thể trợ giúp:

Giả sử bạn có Máy chủ JMX (bí danh 'Đại lý JMX' bí danh 'JVM bạn muốn kết nối với') chạy trên 'MỤC TIÊU' với cổng đăng ký RMI tại 'RMI REGISTRY PORT' và cổng máy chủ JMX RMI tại 'JMX RMI SERVER PORT'.

Lưu ý:

  1. Các RMI registry nói với khách hàng JMX nơi để tìm thấy máy chủ cổng JMX RMI; có thể lấy thông tin theo khóa jmxrmi.
  2. Cổng đăng ký RMI RMI thường được gọi là được đặt thông qua thuộc tính hệ thống khi khởi động JVM.
  3. Cổng máy chủ JMX RMI thường là không được gọi là JVM chọn 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 đây 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

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ụ" RFC2609, đúng vậy, 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ụ gồm: loại trừu tượngjmxURL chương trìnhrmi
  • phần còn lại - sap (đặc tả giao thức truy cập dịch vụ)

sap bị phân hủy thành:

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

Một đầy đủ thông tin JMX client kết nối đến "ipsite" để làm JMX -giao dịch trên RMI; nhưng những gì của khách hàng JMX không BIẾT cổng đó? Kiên nhẫn ...

URL phần bị phân hủy thành:

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

Đây là phần nào trước khi có ngựa, như đã có o liên hệ với số đăng ký RMI do trước tiên là sau một phần của URL SLP.

Sau khi gãi đầu, trực giác, chúng ta hãy thử:

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

Vâng, đó là hiệu quả! Cổng máy chủ JMX RMI được lấy từ registry. Trên những suy nghĩ thứ hai, máy mục tiêu cũng nên được lấy từ registry, như sau:

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

Thậm chí tốt hơn, mà làm việc, quá!

Tài liệu tham khảo:

  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
2

Theo javax.management.remote.rmi

url này được lắp ráp như thế này

service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname 
+3

tôi nghĩ rằng anh ấy đang hỏi tại sao nó lại quá phức tạp. – djangofan

5

Để 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ó một chất độc da JMX trên máy với địa chỉ IP 192.168.30.10. Tác nhân JMX đang sử dụng (TCP) cổng 1234 để cung cấp dịch vụ JMX (s) trên 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 RMI stub tương tác với JMX Agent trên RMI có thể 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. Để lấy RMI bạn cần phải tra cứu ràng buộc "jmxrmi".

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

Hy vọng điều này sẽ hữu ích.

+0

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