Map<String, Object>
을 매개 변수로 사용하는 MBean
에 문제가 있습니다. 내가 프록시 개체를 사용하여 JMX를 통해 그것을 실행하려고하면, 나는 예외를 얻을 :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)
인터페이스가 아닌 실제 구현 클래스를 사용하려고 시도하고 이것이인지 확인하지 않는 것 같습니다 필요한 인터페이스의 자식. 확장 클래스에서도 마찬가지입니다 (예 : HashMap
선언, 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;
}
}
Hi Thor; 프록시 객체를 생성하는 코드를 제공 할 수 있습니까? – Nicholas
저는 사내 유틸리티 클래스를 사용하고 있습니다. 솔직히 말해서 실제로 진행되고있는 일을 실제로 해결할 수 있을지 확신하지 못합니다. 보안과 관련하여 많은 추가 작업을하고 있으며, 지금까지 본 적이 있지만) 중요한 비트를 추출하여 게시물에 추가하려고 노력할 것입니다. – Thor84no