java - 如何通过JMX获取James Server中注册的用户列表

标签 java grails groovy jmx james

我已经配置了 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();

    }

请帮助使此代码正常工作以获取用户列表。

This is the Jconsole screen for getting the Users list from James Server

最佳答案

当通过 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/

相关文章:

域类的 Grails 自定义验证器

grails - @MessageMapping 与 Grails spring-websocket 插件

java - 将多个对象添加到 JPanel 后,仅绘制最后一个 JComponent

java - 多键值对搜索

elasticsearch - 服务被注入(inject),但在使用其属性时导致空指针异常。可能的原因是什么?

java - 为什么即使在更新了 Grails 中的 Selenium 依赖项后,我的 Geb 测试仍会返回 "failed to create driver from callback"?

java - Groovy Mockito NullPointerException

java - 使用 JRun 托管 Java Servlet 时遇到问题

java - 自定义 ArrayAdapter.add() 不改变我的 TextView

java - Groovy 依赖注入(inject)