从终端向Clojure应用程序发送消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从终端向Clojure应用程序发送消息相关的知识,希望对你有一定的参考价值。

如何向正在运行的clojure应用程序发送消息?例如,如果我有一个特定的变量或标志,我想在uberjar运行时从终端设置 - 这可能吗?

一种方法是读取应用程序中可以更改的文件,但这听起来很笨拙。

提前致谢!

答案

一种方法是让您的应用程序托管一个nREPL(网络REPL)。然后,您可以连接到正在运行的应用程序的nREPL并乱七八糟。

例如,您的应用可能如下所示:

(ns sandbox.main
  (:require [clojure.tools.nrepl.server :as serv]))

(def value (atom "Hey!"))

(defn -main []
  (serv/start-server :port 7888)
  (while true
    (Thread/sleep 1000)
    (prn @value)))

当你正在运行时,你可以从其他地方lein repl :connect localhost:7888并改变那个value原子:

user=> (in-ns 'sandbox.main)
#object[clojure.lang.Namespace 0x12b094cf "sandbox.main"]
sandbox.main=> (reset! value "Bye!")
"Bye!"

此时,应用程序的控制台输出应如下所示:

$ lein run
"Hey!"
"Hey!"
<...truncated...>
"Bye!"
"Bye!"

JVM上有许多进程间通信选项,但这种方法对Clojure来说是独一无二的。

以上是关于从终端向Clojure应用程序发送消息的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统shell脚本之向指定终端发送消息

Clojure“发送”和“发送”函数在向代理分派动作方面有啥区别?

从 ios 向 watchos 发送消息的问题

如何从我的 Android 应用程序通过 WhatsApp 向特定联系人发送消息?

从 Service 向 Activity 发送简单消息

Android - 向特定号码发送电报消息