我有一个使用nodejs构建的Web应用程序。后端正在调用几个java命令行来回答查询。那些java程序依赖于非常庞大的模型(大约50Mo),并且对于每个执行的java命令行,需要重新加载模型。最后,大部分答案时间花在将这些模型加载到RAM中。
我想要做的是设置一个java服务器和nodejs一个,并使这两个服务器进行通信。 java服务器会将模型保存在RAM中并处理所有java处理。问题是节点是异步的,我想在我的java服务器结束处理数据时触发回调。你知道有什么好办法吗?是否可以在localhost上从节点向java发送某种POST请求?
修改
好的,因为all_different/1
和jfriend00回答了我,我取得了一些进展。我决定使用Pelit Mamani的解决方案来使用socket.io。这正是我想要做的(这里是javascript):
我有一台服务器(我想用Java编写的服务器,这里是javascript)
var http = require('http');
console.log('Creating HTTP server');
var server = http.createServer(function(req, res){
});
var io = require('socket.io').listen(server);
io.sockets.on('connection', function(socket) {
console.log('Client connected.');
// Disconnect listener
socket.on('disconnect', function() {
console.log('Client disconnected.');
});
socket.on('myEvent', function (data, fn) {
console.log(data);
console.log('\tSending answer ...');
fn('\tI am the answer');
});
});
server.listen(8080);
我有一个客户端(在我的情况下,它将是我的nodejs服务器):
// Connect to server
var io = require('socket.io-client')
var socket = io.connect('http://localhost:8080');
socket.on('connect', function () {
console.log('Connected!\n\tSending query ...');
socket.emit('myEvent', '\tI am the query', function (data) {
console.log(data);
});
});
客户端发送查询,服务器回答查询,简单。我使用jfriend00在java中实现服务器部分。这就是我现在所拥有的:
import java.io.UnsupportedEncodingException;
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.Transport;
import com.corundumstudio.socketio.listener.*;
public class App {
public static void main(String[] args) throws InterruptedException, UnsupportedEncodingException {
Configuration config = new Configuration();
config.setHostname("localhost");
config.setPort(8080);
final SocketIOServer server = new SocketIOServer(config);
server.addConnectListener(new ConnectListener() {
@Override
public void onConnect(SocketIOClient client) {
System.out.println("client connected !: "+client.toString());
}
});
server.addEventListener("myEvent", String.class, new DataListener<String>() {
@Override
public void onData(final SocketIOClient client, String data, final AckRequest ackRequest) {
System.out.println("myEvent triggered");
System.out.println("Here is the query from the client: \n"+data);
ackRequest.sendAckData("I am the answer from the Server!");
}
});
server.addDisconnectListener(new DisconnectListener() {
@Override
public void onDisconnect(SocketIOClient client) {
System.out.println("client disconnected !: "+client.toString());
}
});
server.start();
System.out.println("server started");
Thread.sleep(20000);//Integer.MAX_VALUE);
server.stop();
System.out.println("server stopped");
}
}
使用我的javascript客户端运行此服务器时,一切正常:
在客户端:
Connected!
Sending query ...
I am the answer from the Server!
在服务器端:
server started
client connected !: com.corundumstudio.socketio.transport.NamespaceClient@ecac7898
myEvent triggered
Here is the query from the client:
I am the query
client disconnected !: com.corundumstudio.socketio.transport.NamespaceClient@ecac7898
但我不认为AckRequest应该用来发送这样的数据。我可能会改变另一个实现。继续......
答案 0 :(得分:1)
如果你使用http或tcp,node.js是异步的这一事实并不能阻止java方面同步工作&#34; ...如果你有一个标准的Servlet来读取请求并写一个回复(在同一个线程上),它仍会转换为node.js端的标准异步代码。它会发送请求,然后在java回答时收到回调...
作为旁注,您可能还想查看异步队列协议(如Rabbit MQ),但这超出了您所描述的基本要求。例如。这取决于你需要通信的可靠性,如果java服务器崩溃会发生什么等。