如何创建一个可以与持续 运行 服务交互的 CLI,类似于 MySQL 的 shell?

How to create a CLI that can interact with a continuously running service, similar to MySQL's shell?

我有一个小应用程序需要在后台持续 运行。该程序能够设置目录监控服务、HTTPS 侦听器和其他需要作为主服务线程的一部分保留 运行ning 的服务。

然而,用户还需要与程序交互并手动执行任务,配置各种设置等。我使用 jline 和 argsparse4j 制作了一个命令行界面,允许用户执行此操作。

我可以 运行 主 CLI 线程,它可以做我想做的所有事情,但是一旦我关闭线程,所有这些服务都会随主线程一起关闭。

我已经使用进程构建器和 shell 脚本将 jvm 的单独实例启动到 运行 某些进程来解决这个问题,但这感觉不对。

我需要在这里结合两全其美,通过拥有一个持久的服务,用户基本上可以登录和注销,但都是本地的。首先想到的是 mysql 的行为方式。 MySQL 运行 始终作为一项服务,但用户可以键入 mysql 和一些登录参数,以及 "login" 到 mysql 来执行命令。这正是我希望我的程序运行的方式。

我的第一个想法是将所有功能包装在某种 API 中,并可能使用像 AMQP 这样的消息队列协议,然后解耦命令行界面以将消息发送到服务。这也很有意义,因为我们还在同一客户端上启用 HTTPS REST API,以允许远程用户使用其功能。所以我们只需要在 API.

中处理两个消息协议

但是,我想知道是否有比编写完整的基于消息的客户端-服务器 API 更好或更简单的替代方案?

最终,我们选择了使用 Spark Framework for Java 实现后端 REST API 的路线。这可能不是最强大的,用户反馈一直是个问题。我们拆分了命令行界面来提交 REST 调用,并向用户显示结果。