JMX mit RMI Adaptor ( MX4J )

kleinevroni

Mitglied
Hallo zusammen,

ich wollte euch mal fragen, ob jemand von euch schon mal eine Anwendung mit JMX/RMI überwacht hat.

Ich versuche hier nämlich, einen solchen RMI Adapter zu schreiben, aber ich komm auf keinen grünen Zweig.

Der Adapter soll die Schnittstelle zu einer Application Management Software sein, die dann das Programm überwachen soll. ( AdventNet AppManager 6 )

MfG

Vroni
 
Hallo!

Habs mit MX4J (3.0.1) und J2SDK 1.4.2_07 ausprobiert:

Die "Anwendung":
Code:
  /**
   * 
   */
  package de.tutorials.mx4j;
  
  import java.rmi.registry.LocateRegistry;
  import java.util.Timer;
  import java.util.TimerTask;
  
  import javax.management.MBeanServer;
  import javax.management.MBeanServerFactory;
  import javax.management.ObjectName;
  import javax.management.remote.JMXConnectorServer;
  import javax.management.remote.JMXConnectorServerFactory;
  import javax.management.remote.JMXServiceURL;
  
  /**
   * @author Tom
   * 
   */
  public class SimpleApplication {
  
  	private MBeanServer mbeanServer;
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) throws Exception {
  		new SimpleApplication().run();
  	}
  
  	private void run() throws Exception {
  		lookupRMIRegistry(9999);
  		setupMBeanServer();
  		final Worker w = new Worker();
  		registerWorkerForObjectMonitoring(w,
 				"de.tutorials:name=Worker,type=Worker");
  
  		Timer timer = new Timer();
  		timer.schedule(new TimerTask() {
  			public void run() {
  				w.doSomeWork();
  			}
  		}, 0L, 1000L);
  
  	}
  
  	private void lookupRMIRegistry(int port) throws Exception {
  		LocateRegistry.createRegistry(port);
  	}
  
  	private void setupMBeanServer() throws Exception {
  		mbeanServer = MBeanServerFactory.createMBeanServer();
  		JMXServiceURL serviceURL = new JMXServiceURL(
  		        "service:jmx:rmi:///jndi/rmi://localhost:9999/simpleApplication");
  		JMXConnectorServer connectorServer = JMXConnectorServerFactory
 		 	.newJMXConnectorServer(serviceURL, null, mbeanServer);
  		connectorServer.start();
  	}
  
  	private void registerWorkerForObjectMonitoring(Worker w,
  			String theObjectName) throws Exception {
  		mbeanServer.registerMBean(w, new ObjectName(theObjectName));
  	}
  }

Die Worker-Implementierung:
Code:
  /**
   * 
   */
  package de.tutorials.mx4j;
  
  import javax.management.AttributeChangeNotification;
  import javax.management.NotificationBroadcasterSupport;
  
  class Worker extends NotificationBroadcasterSupport
  		implements
  			WorkerMBean {
  	int counter;
  
  	public Worker() {
  
  	}
  
  	public void doSomeWork() {
  		setCounter(getCounter() + 1);
  		System.out.println(getCounter());
  	}
  	public int getCounter() {
  		return counter;
  	}
  
  	public void setCounter(int counter) {
  		sendNotification(new AttributeChangeNotification(this, 0, System
 		 	.currentTimeMillis(), "Current value changed", "counter",
 		 	"int", new Integer(counter), new Integer(this.counter)));
  		this.counter = counter;
  	}
  }

Das Interface Worker MBean:
Code:
  /**
   * 
   */
  package de.tutorials.mx4j;
  
  /**
   * @author Tom
   *
   */
  public interface WorkerMBean {
  	public void setCounter(int counter);
  	public int getCounter();
  }

unser Client:
Code:
  /**
   * 
   */
  package de.tutorials.mx4j;
  
  import javax.management.MBeanServerConnection;
  import javax.management.Notification;
  import javax.management.NotificationListener;
  import javax.management.ObjectName;
  import javax.management.remote.JMXConnector;
  import javax.management.remote.JMXConnectorFactory;
  import javax.management.remote.JMXServiceURL;
  
  /**
   * @author Tom
   * 
   */
  public class Client {
  
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) throws Exception {
  		JMXServiceURL url = new JMXServiceURL(
  		        "service:jmx:rmi:///jndi/rmi://localhost:9999/simpleApplication");
  		JMXConnector connector = JMXConnectorFactory.connect(url, null);
  		MBeanServerConnection beanServerConnection = connector
  				.getMBeanServerConnection();
  		beanServerConnection.addNotificationListener(new ObjectName(
 				"de.tutorials:name=Example,type=Example"),
  				new NotificationListener() {
 		 		public void handleNotification(Notification notification,
 		 		 	Object handback) {
 		 		 System.out.println(notification);
  					};
  				}, null, null);
  
  		Thread.sleep(Integer.MAX_VALUE);
  	}
  }

Ausgeführt hab ich sowohl Client als auch Server unter Java 1.4
Jedoch habe ich zusätzlich mit der jconsole (%JDK_HOME%/bin/jconsole.exe) von Java 1.5.0_04 das Verbinden getestet. Dort muss man im Fenster "JConsole:Connect to Agent" unter Advanced in diesem Fall nur die entsprechende jmx-service URL angeben: service:jmx:rmi:///jndi/rmi://localhost:9999/simpleApplication

Habe das Beispiel nur Lokal laufen lassen. Es kann sein, dass für Remote Zugriff erst noch ein paar Sicherheitstechnische Dinge konfiguriert werden müssen (Policy etc...)
mehr dazu findet man hier: http://java.sun.com/j2se/1.5.0/docs/guide/jmx/tutorial/tutorialTOC.html

Gruss Tom
 

Anhänge

  • jmxconsole.jpg
    jmxconsole.jpg
    41,7 KB · Aufrufe: 286
Wow,
guten morgen erstmal

vielen dank, werd das heute mal ausprobieren

du solltest dein wissen nicht so öffentlich kundtun, sonst musst du irgendwann pilger abweisen *g*
 
Es geht
es geht es geht es geht


das war dir wahrscheinlich schon klar
aber nachdem ich seit zwei tagen daran gescheitert und verwzweifelt bin...

du bist ein schatz
 
Bitteschön

Guten Appetit

Und noch was zum eigtl Thema:
Ich glaub ich hatte "nur" lookupRMIRegistry(...) - also was dahintersteckt - vergessen. habs zwar über dosbox gestartet, aber hat scheinbar nicht gewirkt...
Und daran bin ich 2 Tage gescheitert...
 
Zuletzt bearbeitet:
hallo zusammen. endlich habe ich jemand gefunden, der sich mit diesem thema auskennt.
ich habe ein ähnliches Problem.
Ich muss einen remote Client schreiben, der ebenfalls auf einen Mbeanserver (bea weblogic) zugreift.
Dann soll ich die beanstruktur in einem baum abbilden und wenn man auf ein bean klickt, sollten die infos angezeigt werden.
meine Frage ist nun... sind die knotenpunkte auch beans oder einfach nur ordner? wie greift man auf den server zu und liest alle mbeans aus und zeigt deren infos an...
danke
 
Hallo!

Innerhalb von JXM haben alle MBeans einen Objectnamen über den sie Identifizierbar sind.
Der Objectname setzt sich dabei aus einer Domäne (de.tutorials.jmx.profiling) einem ":" und einer Auflistung von Key-Value Paaren.
Also beispielsweise wäre
de.tutorials.jmx.profiling:name=MemoryProfiler,type=de.tutorials.jmx.profiling.memory.MemoryProfiler, paramX=valueY
ein gültiger Objectname.
In deinem Baum könntest du beispielsweise die einzelnen Teile des Domainnames als Knoten darstellen und die Beans als Blätter.
Ich hab im moment kein BWLS Installiert weshalb ich das nicht ausprobieren kann. Aber du solltest dich mit dem Client-Code aus meinem Beispiel mit dem Server verbinden können. Es kann aber auch sein, dass BEA da eigene Bibliotheken mitliefert.

Gruß Tom
 

Neue Beiträge

Zurück