我正在编写一个Java库,实际上是一个Clojure库,但对于这个问题,重要的是它在JVM上运行.这个库需要执行一些JavaScript.我试过Nashorn但我遇到了一些可能难以克服的限制.作为替代方案,我想尝试NodeJS.
我希望我的库是自包含的,不依赖于独立运行NodeJS的系统,因此需要特定的部署机制将Java和NodeJS工件放在正确的位置以便由两个不同的网络服务器拾取.但是,这种方法带来了一些问题.
我将通过HTTP与NodeJS交谈,但我不希望NodeJS打开特定端口.我想找一个随机未使用的,所以没有碰撞.我还想控制来自NodeJS的日志的位置,以便将它们与我的应用程序的其余部分保持一致.最后,我的应用程序应该能够检测到NodeJS何时崩溃并重新运行它或报告错误信息.
什么是最好的方法来解决这个问题?是否有任何Java库以这种方式帮助管理子进程?我应该从NodeJS方面做一些特别的事情(我是NodeJS的新手,我之前从未使用过它).
我http.request()在普通的HTTP服务器上使用Node的基本功能没有问题.我需要http.request()与SHOUTcast服务器一起使用(或类似).SHOUTcast"协议"与HTTP完全兼容,除了一个细节......第一个响应行.
普通HTTP服务器响应:
HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)
SHOUTcast服务器响应:
ICY 200 OK
Run Code Online (Sandbox Code Playgroud)
同样,协议的其余部分是相同的.唯一的区别是HTTP/1.xvs ICY..
我想扩展,子类或以某种方式修改Node的http.request()功能,以便我可以使它与SHOUTcast服务器一起工作.之前已经完成了与节点连接到SHOUTcast ,但只能通过重新发明整个轮子.我宁愿不这样做,因为它只是一个小的协议差异.
创建我自己的代码来解析HTTP的相关部分,但尽可能多地重用HTTP的现有Node组件.
创建一个简单的内部代理(或以某种方式中继数据),以便我可以在它到达Node的HTTP解析器之前修改第一个服务器响应行.
别的什么?
我也考虑过使用Shred,但它没有提供流式响应的选项.(它等待整个服务器响应在触发事件之前完成,这对于数据无限期运行的流服务器不起作用.)沿着同样的路线,我尝试了Request,但它使用了Node自己的HTTP解析器,所以我得到与原生HTTP客户端相同的解析错误.