3

我已经配置了 James 服务器并向其添加了一些用户和域。

从 Jconsole 我可以获取用户列表,如下图所示。

谁能给我提供代码片段以通过JMX获得相同的结果

正如詹姆斯文档所指定的那样,通过 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();

    }

请帮助获取此代码以获取用户列表。

这是从 James Server 获取用户列表的 Jconsole 屏幕

4

1 回答 1

0

通过 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 对象,该对象在其 InvocationHandler 中使用 MBeanServerConnection.invoke 方法。然后,您可以像使用类的普通实例一样使用 Proxy 对象。对于这种方法,您的目标 MBean 必须实现一个可用于生成本地代理的接口。

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 上调用不带参数或不带参数的方法。

于 2015-07-02T21:23:26.883 回答