我正在使用jmx api开发一个监控管理java应用程序。我已经在互联网上看到了一些示例,能够从客户端应用程序到服务器进行远程调用。我的问题是,这一点是远程通信参数的最佳实践客户端和服务器之间的方法。例如,我可以使用一些像hashtable这样的集合对象,然后再将一个hashmap作为响应返回。另一个aproach可以在客户端生成一个字符串并在服务器端解析它。另一个aproach可以是在两侧生成不同的可串行对象并传递其xml represantations可能是(我试试这个,所以不确定它的技术可能性)。 哪种方法(考虑下面的方法签名)将是最佳的并且适用于不同的输入/输出对。
1)Hashmap methodCollection(Hashmap);
2)String methodRawString(String);
3)String methodObjectToXML(String inputObjectXML);
答案 0 :(得分:2)
这取决于你的任务。理论上,自定义可序列化类(值对象)是更好更容易的方法。 但在这种情况下,您应确保双方(客户端和服务器)上的这些类具有完全相同的版本。
如果您无法保证这一点,并且您的数据模型相对简单,即可以表示为基元的基元和集合(或地图),请使用地图和集合。
格式化的字符串(XML,JSON等)是最便携和最难的方式。您必须生成和解析XML,处理格式的不同版本等。但您永远不会得到序列化异常,理论上可以支持跨版本的可比性。
答案 1 :(得分:2)
使用JMX,MXBean功能非常有趣:您可以在服务器上拥有相当复杂的对象,而无需在客户端部署任何JAR。这里有一篇好文章:http://java.sun.com/developer/technicalArticles/J2SE/mxbeans/。
此外,http://www.jolokia.org/是一个JMX / HTTP网桥,提供对JMX bean的REST / JSON访问。如果客户端不是Java应用程序(例如shell脚本),则非常有用。
答案 2 :(得分:2)
Jolokia有一种复杂的方法可以在两个方向上序列化对象。在下游(从服务器到客户端),每个对象都可以序列化为JSON对象。对于上游(从客户端到服务器,用于作为方法参数或写操作中的值使用的ojbects),序列化有点受限,但是当元素的类型是基本类型时,可以很容易地使用映射和列表集合(字符串,数字,布尔值,其他地图或列表)。因此,Jolokia非常适合无类型JMX远程处理。
另一个解决方案是将自己限制在双方都可用的OpenType,而无需额外的类型信息。使用OpenType,您还可以轻松地为集合建模(TabularData)。对于从任意Java对象到OpenType的转换,MXBean框架确实非常有用(尽管从地图转换会产生相当复杂的TabularData
格式)。