这是一个非常粗略和简单的示例,说明如何执行此操作。我有
在这里放弃了 Camunda,因为我认为它实际上并不相关。
这里的方法:
- 创建委托给实际 Clojure 代码的 Spring 服务。
- 确保将该代码的“当前良好版本”加载到您的
过程
- 启动“服务器 REPL”以允许覆盖
完整的项目可以在here找到
提供一个委托给一些 Clojure 代码的服务:
@Service
class ClojureBackedService {
BigDecimal add(BigDecimal a, BigDecimal b) {
Clojure.var('net.ofnir.repl', 'add').invoke(a, b)
}
}
启动一个 REPL 并加载一些“良好的初始设置”:
@Service
class ClojureRepl {
@PostConstruct
def init() {
def require = Clojure.var('clojure.core', 'require')
require.invoke(Clojure.read('net.ofnir.repl'))
Clojure.var('clojure.core.server', 'start-server').invoke(
Clojure.read("{:port 5555 :name spring-repl :accept clojure.core.server/repl}")
)
}
@PreDestroy
def destroy() {
Clojure.var('clojure.core.server', 'stop-server').invoke(
Clojure.read("{:name spring-repl}")
)
}
}
为了展示它是如何工作的,提供一个网络端点,它增加了两个
数字:
@RestController
class MathController {
private final ClojureBackedService backend
MathController(ClojureBackedService backend) {
this.backend = backend
}
@PostMapping
def add(BigDecimal a, BigDecimal b) {
backend.add(a, b)
}
}
运行应用程序并进行第一次测试:
$ curl -da=5 -db=5 localhost:8080
10
看起来不错。现在连接到 REPL 并替换 add 函数:
$ telnet localhost 5555
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
user=> (ns net.ofnir.repl)
nil
net.ofnir.repl=> (defn add [a b] (* a b))
#'net.ofnir.repl/add
不再调用端点:
$ curl -da=5 -db=5 localhost:8080
25
你的 spring 服务在运行时发生了变化。