KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > test > mx4j > tools > remote > proxy > RemoteMBeanProxyTest


1 /*
2  * Copyright (C) The MX4J Contributors.
3  * All rights reserved.
4  *
5  * This software is distributed under the terms of the MX4J License version 1.0.
6  * See the terms of the MX4J License in the documentation provided with this software.
7  */

8
9 package test.mx4j.tools.remote.proxy;
10
11 import java.io.IOException JavaDoc;
12 import java.net.URL JavaDoc;
13 import javax.management.MBeanServer JavaDoc;
14 import javax.management.MBeanServerConnection JavaDoc;
15 import javax.management.MBeanServerDelegateMBean JavaDoc;
16 import javax.management.MBeanServerInvocationHandler JavaDoc;
17 import javax.management.Notification JavaDoc;
18 import javax.management.NotificationListener JavaDoc;
19 import javax.management.ObjectName JavaDoc;
20 import javax.management.loading.MLet JavaDoc;
21 import javax.management.remote.JMXConnector JavaDoc;
22 import javax.management.remote.JMXConnectorFactory JavaDoc;
23 import javax.management.remote.JMXConnectorServer JavaDoc;
24 import javax.management.remote.JMXConnectorServerFactory JavaDoc;
25 import javax.management.remote.JMXServiceURL JavaDoc;
26 import javax.management.timer.Timer JavaDoc;
27
28 import mx4j.tools.remote.proxy.RemoteMBeanProxy;
29 import mx4j.util.Utils;
30 import test.MX4JTestCase;
31 import test.MutableObject;
32
33 /**
34  * @version $Revision: 1.6 $
35  */

36 public class RemoteMBeanProxyTest extends MX4JTestCase
37 {
38    public RemoteMBeanProxyTest(String JavaDoc s)
39    {
40       super(s);
41    }
42
43    public void testNotifications() throws Exception JavaDoc
44    {
45       // The remote MBeanServer
46
MBeanServer JavaDoc remoteServer = newMBeanServer();
47
48       JMXServiceURL JavaDoc address1 = new JMXServiceURL JavaDoc("rmi", "localhost", 0);
49       JMXConnectorServer JavaDoc connectorServer1 = JMXConnectorServerFactory.newJMXConnectorServer(address1, null, null);
50       ObjectName JavaDoc connectorServerName1 = ObjectName.getInstance(":type=connector,protocol=" + address1.getProtocol());
51       remoteServer.registerMBean(connectorServer1, connectorServerName1);
52       connectorServer1.start();
53       address1 = connectorServer1.getAddress();
54
55       ObjectName JavaDoc remoteDelegateName = ObjectName.getInstance("JMImplementation:type=MBeanServerDelegate");
56
57       // The local MBeanServer
58
MBeanServer JavaDoc localServer = newMBeanServer();
59
60       // The MBean proxy for the remote delegate
61
JMXConnector JavaDoc cntor = JMXConnectorFactory.newJMXConnector(address1, null);
62       RemoteMBeanProxy proxy = new RemoteMBeanProxy(remoteDelegateName, cntor, null, null);
63       ObjectName JavaDoc proxyName = ObjectName.getInstance(":proxy=" + ObjectName.quote(remoteDelegateName.getCanonicalName()));
64       localServer.registerMBean(proxy, proxyName);
65
66       // Register a listener to the MBean proxy for the remote delegate
67
final MutableObject holder = new MutableObject(null);
68       NotificationListener JavaDoc listener = new NotificationListener JavaDoc()
69       {
70          public void handleNotification(Notification JavaDoc notification, Object JavaDoc handback)
71          {
72             synchronized (holder)
73             {
74                holder.set(notification);
75             }
76          }
77       };
78       localServer.addNotificationListener(proxyName, listener, null, null);
79
80       // Sleep to make sure the remote notifications threads started before we emit the notification
81
sleep(1000);
82
83       // Add an MBean to the remote MBeanServer: this will trigger a notification from the remote delegate,
84
// that should be dispatched transparently the the listener above
85
MLet JavaDoc remoteMLet = new MLet JavaDoc();
86       ObjectName JavaDoc remoteMLetName = ObjectName.getInstance(":type=mlet");
87       remoteServer.registerMBean(remoteMLet, remoteMLetName);
88
89       synchronized (holder)
90       {
91          while (holder.get() == null) holder.wait(10);
92          assertNotNull(holder.get());
93          holder.set(null);
94       }
95
96       // Remove the listener
97
localServer.removeNotificationListener(proxyName, listener);
98
99       // Unregister the MLet: this will trigger a notification
100
remoteServer.unregisterMBean(remoteMLetName);
101
102       assertNull(holder.get());
103    }
104
105    public void testMultipleRemoteMBeanServers() throws Exception JavaDoc
106    {
107       // The 1st remote server
108
MBeanServer JavaDoc remoteServer1 = newMBeanServer();
109       MLet JavaDoc mlet = new MLet JavaDoc(new URL JavaDoc[]{new URL JavaDoc("http", "host", 80, "/path")});
110       ObjectName JavaDoc remoteMLetName = ObjectName.getInstance(":type=mlet");
111       remoteServer1.registerMBean(mlet, remoteMLetName);
112       JMXServiceURL JavaDoc address1 = new JMXServiceURL JavaDoc("rmi", "localhost", 0);
113       JMXConnectorServer JavaDoc connectorServer1 = JMXConnectorServerFactory.newJMXConnectorServer(address1, null, null);
114       ObjectName JavaDoc connectorServerName1 = ObjectName.getInstance(":type=connector,protocol=" + address1.getProtocol());
115       remoteServer1.registerMBean(connectorServer1, connectorServerName1);
116       connectorServer1.start();
117       address1 = connectorServer1.getAddress();
118
119       // The 2nd remote server
120
MBeanServer JavaDoc remoteServer2 = newMBeanServer();
121       Timer JavaDoc timer = new Timer JavaDoc();
122       ObjectName JavaDoc remoteTimerName = ObjectName.getInstance(":type=timer");
123       remoteServer2.registerMBean(timer, remoteTimerName);
124       timer.start();
125       JMXServiceURL JavaDoc address2 = new JMXServiceURL JavaDoc("rmi", "localhost", 0);
126       JMXConnectorServer JavaDoc connectorServer2 = JMXConnectorServerFactory.newJMXConnectorServer(address2, null, remoteServer2);
127       connectorServer2.start();
128       address2 = connectorServer2.getAddress();
129
130       // The local server
131
MBeanServer JavaDoc localServer = newMBeanServer();
132       RemoteMBeanProxy proxy1 = new RemoteMBeanProxy(remoteMLetName, address1, null, null);
133       JMXConnector JavaDoc cntor = JMXConnectorFactory.connect(address2);
134       RemoteMBeanProxy proxy2 = new RemoteMBeanProxy(remoteTimerName, cntor.getMBeanServerConnection());
135       ObjectName JavaDoc proxyName1 = ObjectName.getInstance(":proxy=" + ObjectName.quote(remoteMLetName.getCanonicalName()));
136       ObjectName JavaDoc proxyName2 = ObjectName.getInstance(":proxy=" + ObjectName.quote(remoteTimerName.getCanonicalName()));
137       localServer.registerMBean(proxy1, proxyName1);
138       localServer.registerMBean(proxy2, proxyName2);
139       JMXServiceURL JavaDoc address3 = new JMXServiceURL JavaDoc("local", "localhost", 0);
140       JMXConnectorServer JavaDoc connectorServer3 = JMXConnectorServerFactory.newJMXConnectorServer(address3, null, localServer);
141       connectorServer3.start();
142       address3 = connectorServer3.getAddress();
143
144       // The client
145
JMXConnector JavaDoc connector = JMXConnectorFactory.connect(address3);
146       MBeanServerConnection JavaDoc mbsc = connector.getMBeanServerConnection();
147
148       // Tests
149
URL JavaDoc[] urls = (URL JavaDoc[])mbsc.getAttribute(proxyName1, "URLs");
150       if (!Utils.arrayEquals(urls, mlet.getURLs())) fail();
151
152       if (!timer.isActive()) fail();
153       mbsc.invoke(proxyName2, "stop", null, null);
154       if (timer.isActive()) fail();
155    }
156
157    public void testJMXConnectorCloseOnDeregistration() throws Exception JavaDoc
158    {
159       // The remote MBeanServer
160
MBeanServer JavaDoc remoteServer = newMBeanServer();
161
162       JMXServiceURL JavaDoc address = new JMXServiceURL JavaDoc("rmi", "localhost", 0);
163       JMXConnectorServer JavaDoc connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(address, null, null);
164       ObjectName JavaDoc connectorServerName = ObjectName.getInstance(":type=connector,protocol=" + address.getProtocol());
165       remoteServer.registerMBean(connectorServer, connectorServerName);
166       connectorServer.start();
167       address = connectorServer.getAddress();
168
169       ObjectName JavaDoc remoteDelegateName = ObjectName.getInstance("JMImplementation:type=MBeanServerDelegate");
170
171       // The local MBeanServer
172
MBeanServer JavaDoc localServer = newMBeanServer();
173
174       // The MBean proxy for the remote delegate
175
JMXConnector JavaDoc cntor = JMXConnectorFactory.newJMXConnector(address, null);
176       RemoteMBeanProxy proxy = new RemoteMBeanProxy(remoteDelegateName, cntor, null, null);
177       ObjectName JavaDoc proxyName = ObjectName.getInstance(":proxy=" + ObjectName.quote(remoteDelegateName.getCanonicalName()));
178       localServer.registerMBean(proxy, proxyName);
179
180       // Be sure it works
181
MBeanServerDelegateMBean JavaDoc mbean = (MBeanServerDelegateMBean JavaDoc)MBeanServerInvocationHandler.newProxyInstance(localServer, proxyName, MBeanServerDelegateMBean JavaDoc.class, true);
182       String JavaDoc vendor = mbean.getImplementationVendor();
183       assertNotNull(vendor);
184
185       // Unregister and be sure the connector is closed
186
localServer.unregisterMBean(proxyName);
187       try
188       {
189          cntor.getMBeanServerConnection();
190          fail();
191       }
192       catch (IOException JavaDoc x)
193       {
194       }
195    }
196 }
197
Popular Tags