【问题标题】:Simple send/receive interface to a background Java service application到后台 Java 服务应用程序的简单发送/接收接口
【发布时间】:2014-04-10 07:28:40
【问题描述】:

我有一个无头 Java 应用程序,它永远在后台运行,就像我想的服务/守护程序一样。它在 Linux 上运行并收集数据,将其存储在数据库中,持续循环。

它通过init.d 脚本启动和停止。它在系统启动时启动 jar 在后台运行,并通过在系统关闭时终止特定的 java 进程来停止它。另外,我可以访问此脚本以手动启动/停止,如下所示:

sudo service my-java-app stop

尽管很原始,但这已经足够了。但现在我希望使用更优雅的界面。这将允许我发送命令(即更改数据采集频率和友好终止)和请求数据(即健康检查和统计)。

我以前从未这样做过,我正在寻找一些关于从哪里开始的指导。该应用程序在无头 Linux 的后台运行,因此 GUI 不适合。我曾想过运行一个 http 服务器并监听 POST 和 GET,但这并不容易在 bash 中实现或使用。我认为可能有一个虚拟 COM 端口或我可以创建的东西?甚至是我写入的文本文件,应用程序会定期读取?

我认为最终目标是一种在 bash 中执行命令并让 java 应用程序以某种方式侦听/附加到此的方法。

【问题讨论】:

  • netcat 呢?你可以发送任何东西并用一个简单的脚本包装它会很容易
  • 我认为这取决于您希望如何发出请求:如果您想从其他计算机/设备访问,只需使用浏览器,使用 HTTP GET/POST 似乎是正确的选择。您可以使用curl 从命令行访问。但是,如果您不想进行远程访问,这可能是矫枉过正
  • @rpax netcat 是一个 Linux 程序,对吧?你是建议我用 ProcessBuilder 或类似的东西包装它吗?我假设我会在 bash 中运行 netcat 命令来建立通信。
  • @PabloLozano 我认为 HTTP GET/POST 对于远程来说非常方便。我找到了一个名为Jetty 的简单服务器和一个更简单的调用者NanoHttpd,因此考虑到让服务器运行是多么容易,这可能并不过分。我认为这将是非常通用的。
  • @Darian 不,我的意思是打开一个简单的套接字,然后执行类似的操作: echo "some command to be parsed" | nc 本地主机...

标签: java linux shell user-interface service


【解决方案1】:

我曾经在 Java 代码中使用过套接字。 Java 应用程序作为客户端或守护程序运行。 main() 入口点检查套接字是否打开以了解守护程序是否已经在运行。您可以使用 CLI 参数来说明您是要启动守护程序还是发送命令。

  • 在守护进程启动时,您在特定端口上打开一个套接字
  • 在另一次启动时,检查该特定端口上的套接字是否打开,如果打开,则向其发送消息。

注意:这意味着选择一个固定端口,顺便说一下我不喜欢。

【讨论】:

  • 这可能是一个很好的解决方案,但是如果您有时间,我有几个初学者问题:“套接字”是 Java 独有的吗?另一个外部应用程序可以与此对话吗?传输数据的协议或格式是什么?我在想象一个简洁的 Java 控制台客户端,但如果它可以被 bash 脚本或其他应用程序访问,那就更好了。
  • @Darian 套接字不是 Java 特有的,它是一种 IPC 方式。如果您的 Java 守护程序通过套接字侦听远程命令,您可以从我认为的任何接口发送命令。老实说,我对此并不完全了解,但您可能可以在互联网上找到很多关于套接字的信息。
  • @Darian 顺便说一句,按照我在旧程序中的操作方式,我实际上是通过命令行发送命令的。 Java 不需要 UI ;)
  • 我一直在阅读我不熟悉的 IPC(对于其他不熟悉的人,'IPC' 是 Interprocess Communication)。看起来它会做我需要的。谢谢你的帮助。我也喜欢 HTTP 等其他建议,因为我认为这对于基于远程网页/JavaScript 的界面来说会更容易实现。
猜你喜欢
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2018-09-06
相关资源
最近更新 更多