1

我有一个正在运行的 Java、Scala Web 应用程序在服务器上运行。如何制作用于访问/查询正在运行的应用程序的 cli 界面?在最小值处,我只需要调用正在运行的应用程序的方法并检索它返回的字符串,所有这些都来自命令行。我该怎么做?

注意:Apache Thrift似乎与我的问题有关,但感觉有点矫枉过正。我很想写一个 bash 脚本或一个小的 java 程序,它可以“挂钩”到已经运行的应用程序中。

4

2 回答 2

1

您的程序可以使用附加 API 来定位正在运行的 JVM 并连接到它。

http://docs.oracle.com/javase/7/docs/jdk/api/attach/spec/

然后,您可以告诉它将代理加载到 JVM 中。请参阅 包说明,“在 VM 启动后启动代理”java.lang.instrument章,了解如何实现这样的代理。

该代理可以在目标 JVM 中调用所需的方法。请注意,在处理管理另一个应用程序时,您可能想要执行的许多操作已经存在 JMX 代理。值得研究一下。

于 2013-09-05T11:09:53.597 回答
1

使用 JMX

考虑到您的要求,最简单的解决方案最有可能使用JMX。这正是它的用途,因为它是Java Management eXtensions API。

您可以在Java 教程中找到非常详细的教程线索。它相对简单。您的 Java 程序将侦听来自 JMX 客户端的连接,并允许您查询自己的管理 Bean (MBean)。

然后,管理员将能够使用与 JMX 兼容的客户端(例如jconsole)或自定义客户端。有关自定义 JMX 客户端示例,请参见此处。

另一个很好的(虽然现在有点古老)教程是MBeans 入门


如果您想要截取特定函数的返回值,而不是创建自己的扩展点以进行监控和管理,那么您更有可能想要使用调试器。

此外,您可能对这些 SO 问题感兴趣:

于 2013-09-05T11:13:29.540 回答