我有一个正在运行的 Java、Scala Web 应用程序在服务器上运行。如何制作用于访问/查询正在运行的应用程序的 cli 界面?在最小值处,我只需要调用正在运行的应用程序的方法并检索它返回的字符串,所有这些都来自命令行。我该怎么做?
注意:Apache Thrift似乎与我的问题有关,但感觉有点矫枉过正。我很想写一个 bash 脚本或一个小的 java 程序,它可以“挂钩”到已经运行的应用程序中。
我有一个正在运行的 Java、Scala Web 应用程序在服务器上运行。如何制作用于访问/查询正在运行的应用程序的 cli 界面?在最小值处,我只需要调用正在运行的应用程序的方法并检索它返回的字符串,所有这些都来自命令行。我该怎么做?
注意:Apache Thrift似乎与我的问题有关,但感觉有点矫枉过正。我很想写一个 bash 脚本或一个小的 java 程序,它可以“挂钩”到已经运行的应用程序中。
您的程序可以使用附加 API 来定位正在运行的 JVM 并连接到它。
http://docs.oracle.com/javase/7/docs/jdk/api/attach/spec/
然后,您可以告诉它将代理加载到 JVM 中。请参阅
包说明,“在 VM 启动后启动代理”一java.lang.instrument
章,了解如何实现这样的代理。
该代理可以在目标 JVM 中调用所需的方法。请注意,在处理管理另一个应用程序时,您可能想要执行的许多操作已经存在 JMX 代理。值得研究一下。
考虑到您的要求,最简单的解决方案最有可能使用JMX。这正是它的用途,因为它是Java Management eXtensions API。
您可以在Java 教程中找到非常详细的教程线索。它相对简单。您的 Java 程序将侦听来自 JMX 客户端的连接,并允许您查询自己的管理 Bean (MBean)。
然后,管理员将能够使用与 JMX 兼容的客户端(例如jconsole
)或自定义客户端。有关自定义 JMX 客户端示例,请参见此处。
另一个很好的(虽然现在有点古老)教程是MBeans 入门。
如果您想要截取特定函数的返回值,而不是创建自己的扩展点以进行监控和管理,那么您更有可能想要使用调试器。
此外,您可能对这些 SO 问题感兴趣: