我已经配置了 James 服务器并向其中添加了一些用户和域。
从 Jconsole 中,我可以获得用户列表,如下图所示。
任何人都可以向我提供代码片段以通过 JMX 获得相同的结果
作为 James 文档指定此 To add user Programatically by JMX
不知何故,我设法让代码片段工作,但无法找到如何在没有任何参数的情况下调用 Mbean 的操作。
这段代码正在打印Mbean的属性
String url = "service:jmx:rmi://localhost/jndi/rmi://localhost:9999/jmxrmi";
JMXServiceURL serviceUrl = new JMXServiceURL(url);
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
try {
MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection();
ObjectName mbeanName = new ObjectName("org.apache.james:type=component,name=usersrepository");
MBeanInfo info = mbeanConn.getMBeanInfo(mbeanName);
MBeanAttributeInfo[] attributes = info.getAttributes();
for (MBeanAttributeInfo attr : attributes)
{
System.out.println(attr.getDescription() + " " + mbeanConn.getAttribute(mbeanName,attr.getName()));
}
} finally {
jmxConnector.close();
}
请帮助使此代码正常工作以获取用户列表。
最佳答案
当通过 JMX 对 Bean 调用操作时,调用将通过 MBeanServer 进行代理。您请求 MBeanServer 使用 ObjectName 调用托管 bean 上的某些方法。在代码中,您通过 MBeanServerConnection 访问 MBeanServer。
要调用空白方法,您需要:
MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection();
ObjectName mbeanName = new ObjectName("org.apache.james:type=component,name=usersrepository");
// since you have no parameters, the types and values are null
mbeanConn.invoke(mbeanName, "MethodToInvoke", null, null)
使用 MBeanServer 调用方法可能很麻烦,因此使用 JMX 代理对象可能会更容易。这只是让本地连接构造一个 java.lang.reflect.Proxy 对象,该对象在其 InitationHandler 中使用 MBeanServerConnection.invoke 方法。然后您可以像使用类的普通实例一样使用 Proxy 对象。对于这种方法,您的目标 MBean 必须实现一个可用于生成本地代理的接口(interface)。
import javax.management.JMX;
import org.apache.james.user.api.UsersRepository;
...
UsersRepository proxy = JMX.newMBeanProxy(mbeanConn, mbeanName, UsersRepository.class);
Iterator<String> userList = proxy.list();
这些方法中的任何一种都应该允许您在用户存储库 bean 上调用不带参数或不带参数的方法。
关于java - 如何通过JMX获取James Server中注册的用户列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25641210/