2011-04-05 24 views
35

JMX kullanarak localhost jvm üzerindeki bir java programına bağlanmalıyım. Başka bir deyişle, yerel bir sunucuda bir java programını yapılandırmak için bir JMX istemcisi geliştirmek istiyorum.JMX kullanarak localhost jvm üzerinde bir java programına nasıl bağlanır?

  • JConsole! JConsole uygun değildir, çünkü genel JMX istemcisi ve ana program performansı üzerinde olumsuz etkisi vardır.

  • Oracle site kullanımındaki örnekler RMIConnector ve host: port params ama Bilmiyorum: jmx portunu nerede ayarlamalıdır?

  • JConsole, PID tarafından java işlemlerine bağlanma seçeneğine sahiptir. Ama giriş param olarak PID olan JMX API'da herhangi bir yöntem bulamıyorum.

+1

Hem ana program ve JMX istemci tek başına programlar (Java SE) bulunmaktadır. – mjafari

+0

Ayrıca bkz. Http://www.pongasoft.com/blog/yan/entry/connecting_to_a_local_vm/ –

cevap

56

JMX sunucularımıza program aracılığıyla bağlanmak için aşağıdaki gibi bir şey kullanırız. Sonra da sunucuya bağlanabilirsiniz

-Djava.rmi.server.hostname=A.B.C.D 

:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.port=1234 
-Dcom.sun.management.jmxremote.ssl=false 

belirli bir adrese bağlamak için aşağıdaki VM argümanlar eklemeniz gerekir: Aşağıdaki argümanlar gibi bir şey ile sunucu çalışmalıdır aşağıdaki gibi JMX istemci kodu kullanarak: Biz de programlama yoluyla VM argümanlar dışında belli bir porta kendisini yayınlayabilirsiniz koduna sahip ama bu daha fu

String host = "localhost"; // or some A.B.C.D 
int port = 1234; 
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi"; 
JMXServiceURL serviceUrl = new JMXServiceURL(url); 
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null); 
try { 
    MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection(); 
    // now query to get the beans or whatever 
    Set<ObjectName> beanSet = mbeanConn.queryNames(null, null); 
    ... 
} finally { 
    jmxConnector.close(); 
} 

ihtiyacım var bence. "Pid tarafından" bağlantı açısından


, siz bildiğim kadarıyla Java karadan bunu yapmak için java6 kullanıyor olmanız gerekir. Aşağıdaki kodu kullanmadım ama işe yarıyor gibi görünüyor.

List<VirtualMachineDescriptor> vms = VirtualMachine.list(); 
for (VirtualMachineDescriptor desc : vms) { 
    VirtualMachine vm; 
    try { 
     vm = VirtualMachine.attach(desc); 
    } catch (AttachNotSupportedException e) { 
     continue; 
    } 
    Properties props = vm.getAgentProperties(); 
    String connectorAddress = 
     props.getProperty("com.sun.management.jmxremote.localConnectorAddress"); 
    if (connectorAddress == null) { 
     continue; 
    } 
    JMXServiceURL url = new JMXServiceURL(connectorAddress); 
    JMXConnector connector = JMXConnectorFactory.connect(url); 
    try { 
     MBeanServerConnection mbeanConn = connector.getMBeanServerConnection(); 
     Set<ObjectName> beanSet = mbeanConn.queryNames(null, null); 
     ... 
    } finally { 
     jmxConnector.close(); 
    } 
} 

Ben ettik da kolay bir JMX sunucuyu başlatın ve uzak müşterilerine fasulye yayınlamayı kolaylaştırır SimpleJMX package yazarı.

// create a new server listening on port 8000 
JmxServer jmxServer = new JmxServer(8000); 
// start our server 
jmxServer.start(); 
// register our lookupCache object defined below 
jmxServer.register(lookupCache); 
jmxServer.register(someOtherObject); 
// stop our server 
jmxServer.stop(); 

O da ama şu anda PID süreçleri bulmak için herhangi bir mekanizma olmadığı bir istemci arayüzü var - sadece konak/port kombinasyonları desteklenmektedir (6/2012 olarak).

+1

Teşekkürler Gri! Siz (veya diğer insanlar) ikinci soruma cevap verebilir misiniz (PID kullanarak yerel jmx)? – mjafari

+0

Herhangi bir nedenle ConnectorAddress boşsa, aracıyı dinamik olarak yüklemeyi deneyebilirsiniz. Bkz. Http://www.pongasoft.com/blog/yan/entry/connecting_to_a_local_vm/ –

+0

Satırda bir derleme sorununuz var: jmxConnector.close(); – shlomi33

3
List<VirtualMachineDescriptor> vm = new ArrayList<VirtualMachineDescriptor>(); 
     jvmList = new JVMListManager(); 

     vm = jvmList.listActiveVM(); 

     for (VirtualMachineDescriptor vmD : vm) 
     { 
      try 
      { 

      //importFrom is taking a process ID and returning a service url in a String Format 
      String ServiceUrl = ConnectorAddressLink.importFrom(Integer.parseInt(vmD.id().trim())); 
      JMXServiceURL jmxServiceUrl = new JMXServiceURL(ServiceUrl); 

      jmxConnector = JMXConnectorFactory.connect(jmxServiceUrl, null); 
      con = jmxConnector.getMBeanServerConnection(); 
      CompilationMXBean compMXBean = ManagementFactory.newPlatformMXBeanProxy(con 
        , ManagementFactory.COMPILATION_MXBEAN_NAME 
        , CompilationMXBean.class); 
      }catch(Exception e) 
      { 
      //Do Something 
      } 
     } 


protected List listActiveVM() { 
    List<VirtualMachineDescriptor> vm = VirtualMachine.list(); 

    return vm; 
} 

Bu Okumak çalışıyoruz işlem için JVM başlangıçta jmxremote argüman kullanmanızı gerektirir. Başlangıçta jmxremote argümanını geçmek zorunda kalmadan bunu yapabilmek. Eklenti api kullanmanız gerekecektir (sadece Java 6 ve üstü sürümleri için geçerlidir.

4

Sadece yerel JMX istatistikleri almak istiyorsanız, uzak api kullanmanız gerekmez. java.lang.management.ManagementFactory:

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); 
memoryMXBean.getHeapMemoryUsage().getMax(); 
... 

List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans(); 
... 
1

En basit araçlar:

import javax.management.Attribute; 
import javax.management.AttributeList; 
import java.lang.management.ManagementFactory; 
import javax.management.MBeanServer; 
import javax.management.ObjectName; 

// set a self JMX connection 
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
// set the object name(s) you are willing to query, here a CAMEL JMX object 
ObjectName objn = new ObjectName("org.apache.camel:context=*,type=routes,name=\"route*\""); 
Set<ObjectName> objectInstanceNames = mBeanServer.queryNames(objn, null); 
for (ObjectName on : objectInstanceNames) { 
    // query a number of attributes at once 
    AttributeList attrs = mBeanServer.getAttributes(on, new String[] {"ExchangesCompleted","ExchangesFailed"}); 
    // process attribute values (beware of nulls...) 
    // ... attrs.get(0) ... attrs.get(1) ... 
} 
İlgili konular