Saya mencoba membuka koneksi JMX ke aplikasi java yang berjalan di mesin jarak jauh.
Aplikasi JVM dikonfigurasi dengan opsi berikut:
- com.sun.management.jmxremote
- com.sun.management.jmxremote.port = 1088
- com.sun.management.jmxremote.authenticate = false
- com.sun.management.jmxremote.ssl = false
Saya dapat terhubung localhost:1088
menggunakan jconsole atau jvisualvm. Tetapi saya tidak dapat terhubung menggunakan xxx.xxx.xxx.xxx:1088
dari mesin jarak jauh.
Tidak ada firewall di antara server, atau di OS. Tetapi untuk menghilangkan kemungkinan ini saya telnet xxx.xxx.xxx.xxx 1088
dan saya pikir itu terhubung, karena layar konsol menjadi kosong.
Kedua server tersebut adalah Windows Server 2008 x64. Mencoba dengan 64-bit JVM dan 32-bit, tidak ada yang berhasil.
Jawaban:
Seandainya di Linux masalahnya adalah localhost adalah antarmuka loopback , Anda perlu aplikasi untuk mengikat ke antarmuka jaringan Anda .
Anda dapat menggunakan netstat untuk mengonfirmasi bahwa itu tidak terikat ke antarmuka jaringan yang diharapkan.
Anda dapat membuat ini bekerja dengan menjalankan program dengan parameter sistem
java.rmi.server.hostname="YOUR_IP"
, baik sebagai variabel lingkungan atau menggunakansumber
hostname -i
, lihat stackoverflow.com/a/11654322/99834 untuk detailnya.Saya telah menghabiskan lebih dari satu hari mencoba membuat JMX bekerja dari luar localhost. Tampaknya SUN / Oracle gagal memberikan dokumentasi yang baik tentang hal ini.
Pastikan bahwa perintah berikut mengembalikan Anda IP atau HOSTNAME asli. Jika itu mengembalikan sesuatu seperti 127.0.0.1, 127.0.1.1 atau localhost itu tidak akan berfungsi dan Anda harus memperbarui
/etc/hosts
file.Berikut adalah perintah yang diperlukan untuk mengaktifkan JMX bahkan dari luar
Dimana seperti yang Anda asumsikan, myserver.example.com harus cocok dengan
hostname -i
hasil.Jelas, Anda harus yakin bahwa firewall tidak memblokir Anda, tetapi saya hampir yakin bahwa ini bukan masalah Anda, masalahnya adalah parameter terakhir yang tidak didokumentasikan.
sumber
java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>
. Semoga ini bisa membantu seseorang.Dalam pengujian saya dengan Tomcat dan Java 8, JVM membuka port sementara selain yang ditentukan untuk JMX. Kode berikut memperbaiki saya; mencobanya jika Anda mengalami masalah di mana klien JMX Anda (misalnya VisualVM tidak terhubung.
Lihat juga Mengapa Java membuka 3 port saat JMX dikonfigurasi?
sumber
http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole
Jika Anda mencoba mengakses server yang berada di belakang NAT - kemungkinan besar Anda harus memulai server dengan opsi tersebut
sehingga rintisan RMI yang dikirim ke klien berisi alamat publik server yang memungkinkannya dijangkau oleh klien dari luar.
sumber
itu menegaskan bahwa kutipan akhir Anda datang terlalu dini. Ini harus setelah parameter terakhir.
Trik ini berhasil untuk saya.
Saya melihat sesuatu yang menarik: ketika saya memulai aplikasi saya menggunakan baris perintah berikut:
Jika saya mencoba menyambung ke port ini dari mesin jarak jauh menggunakan jconsole, sambungan TCP berhasil, beberapa data dipertukarkan antara jconsole jarak jauh dan agen jmx lokal tempat MBean saya digunakan, dan kemudian, jconsole menampilkan pesan kesalahan sambungkan. Saya melakukan pengambilan wireshark, dan itu menunjukkan pertukaran data yang berasal dari agen dan jconsole.
Jadi, ini bukan masalah jaringan, jika saya melakukan netstat -an dengan atau tanpa properti sistem java.rmi.server.hostname, saya memiliki binding berikut:
Ini berarti bahwa dalam kedua kasus soket yang dibuat pada port 9999 menerima koneksi dari sembarang host di alamat mana pun.
Saya pikir konten properti sistem ini digunakan di suatu tempat pada koneksi dan dibandingkan dengan alamat IP sebenarnya yang digunakan oleh agen untuk berkomunikasi dengan jconsole. Dan jika alamat tersebut tidak cocok, koneksi gagal.
Saya tidak mengalami masalah ini saat menyambung dari host yang sama menggunakan jconsole, hanya dari host jarak jauh fisik yang sebenarnya. Jadi, saya kira pemeriksaan ini dilakukan hanya ketika koneksi datang dari "luar".
sumber
hal yang berhasil bagi saya adalah mengatur / etc / hosts untuk mengarahkan nama host ke ip dan bukan ke antarmuka loopback dan kemudian memulai ulang aplikasi saya.
kucing / etc / hosts
Ini adalah konfigurasi saya:
sumber
Terima kasih banyak, ini berfungsi seperti ini:
java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = false - Dcom.sun.management.jmxremote.port = 25000 -jar myjar .jar
sumber
Saya tahu utas ini cukup tua, tetapi ada opsi tambahan yang akan sangat membantu. Lihat di sini: https://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/
-Dcom.sun.management.jmxremote.rmi.port=1099
sumber
Saya memiliki masalah yang sama dan saya mengubah nama host apa pun yang cocok dengan nama host lokal menjadi 0.0.0.0, tampaknya berfungsi setelah saya melakukannya.
sumber
Untuk mengaktifkan JMX jarak jauh, berikan parameter VM di bawah ini bersama dengan JAVA Command.
sumber
Coba ini, saya menguji untuk mengakses JMX di dalam container docker
Kemudian
$ jconsole localhost: 16000
sumber
Coba gunakan port yang lebih tinggi dari 3000.
sumber