MBean
パラメータとしてaを使用することに問題がMap<String, Object>
あります。プロキシオブジェクトを使用してJMX経由で実行しようとすると、例外が発生します。
Caused by: javax.management.ReflectionException
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:231)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
Caused by: java.lang.IllegalArgumentException: Unable to find operation updateProperties(java.util.HashMap)
インターフェイスではなく実際の実装クラスを使用しようとしているようで、これが必要なインターフェイスの子であるかどうかはチェックされません。同じことが拡張クラスでも発生します(たとえば、declare HashMap
、pass in LinkedHashMap
)。これは、そのようなメソッドにインターフェイスを使用することが不可能であることを意味しますか?現時点では、メソッドのシグネチャを変更してを受け入れるようHashMap
にしていますが、でインターフェイス(または拡張クラス)を使用できないのは奇妙に思えますMBeans
。
編集:プロキシオブジェクトは、と呼ばれる社内ユーティリティクラスによって作成されていますJmxInvocationHandler
。それの(うまくいけば)関連する部分は次のとおりです:
public class JmxInvocationHandler implements InvocationHandler
{
...
public static <T> T createMBean(final Class<T> iface, SFSTestProperties properties, String mbean, int shHostID)
{
T newProxyInstance = (T) Proxy.newProxyInstance(iface.getClassLoader(), new Class[] { iface }, (InvocationHandler) new JmxInvocationHandler(properties, mbean, shHostID));
return newProxyInstance;
}
...
private JmxInvocationHandler(SFSTestProperties properties, String mbean, int shHostID)
{
this.mbeanName = mbean + MBEAN_SUFFIX + shHostID;
msConfig = new MsConfiguration(properties.getHost(0), properties.getMSAdminPort(), properties.getMSUser(), properties.getMSPassword());
}
...
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
if (management == null)
{
management = ManagementClientStore.getInstance().getManagementClient(msConfig.getHost(),
msConfig.getAdminPort(), msConfig.getUser(), msConfig.getPassword(), false);
}
final Object result = management.methodCall(mbeanName, method.getName(), args == null? new Object[] {} : args);
return result;
}
}