package com.smtaiserver.smtaiserver.lightrag;
|
|
import com.smtaiserver.smtaiserver.core.SMTAIServerApp;
|
import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord;
|
import com.smtservlet.util.Json;
|
import com.smtservlet.util.SMTStatic;
|
import java.io.BufferedReader;
|
import java.io.File;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
import java.net.BindException;
|
import java.net.InetSocketAddress;
|
import java.net.Socket;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Map;
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
public class LightragServer
|
{
|
private static Logger _logger = LogManager.getLogger(LightragServer.class);
|
|
private String _id;
|
private String _port;
|
private Process _process;
|
private Thread _thread;
|
|
public LightragServer(DBRecord rec) throws Exception
|
{
|
_id = rec.getString("server_id");
|
_port = rec.getString("server_port");
|
}
|
|
public String getId()
|
{
|
return _id;
|
}
|
|
public String getPort()
|
{
|
return _port;
|
}
|
|
public void sureRunServer() throws Exception
|
{
|
if(_thread != null && _thread.isAlive())
|
return;
|
|
startServer();
|
}
|
|
private void startServer() throws Exception
|
{
|
Json jsonConfig = (Json)SMTAIServerApp.getApp().getGlobalConfig("lightrag_config");
|
|
List<String> params = new ArrayList<String>();
|
|
for(Json jsonCmd : jsonConfig.getJson("cmd").asJsonList())
|
{
|
params.add(jsonCmd.asString());
|
}
|
|
ProcessBuilder pbuilder=new ProcessBuilder(SMTStatic.convProcessArg(params));
|
pbuilder.redirectErrorStream(true);
|
pbuilder.directory(new File(jsonConfig.getJson("path").asString()));
|
Map<String, String> runEnv = pbuilder.environment();
|
SMTAIServerApp.getApp().setLightragServerDbEnv(runEnv);
|
runEnv.put("POSTGRES_WORKSPACE", _id);
|
runEnv.put("PORT", _port);
|
runEnv.put("PYTHONIOENCODING", "utf-8");
|
_process = pbuilder.start();
|
|
_thread = new Thread()
|
{
|
@Override
|
public void run()
|
{
|
try
|
{
|
InputStream fis = _process.getInputStream();
|
|
BufferedReader bufferedStdout = new BufferedReader(new InputStreamReader(fis, SMTStatic.getStdoutEncode()));
|
String line;
|
while((line = bufferedStdout.readLine()) != null)
|
{
|
_logger.info(line);
|
}
|
|
_process.waitFor();
|
}
|
catch(Exception ex)
|
{
|
_logger.fatal("LightragServer error", ex);
|
}
|
}
|
};
|
_thread.start();
|
|
// 检查指定端口是否已经被绑定,如果绑定则表示服务器启动了
|
try
|
{
|
while(true)
|
{
|
try(Socket socket = new Socket())
|
{
|
socket.bind(new InetSocketAddress("0.0.0.0", Integer.parseInt(_port)));
|
}
|
Thread.sleep(1000);
|
}
|
}
|
catch(BindException ex)
|
{
|
}
|
catch(Exception ex)
|
{
|
throw ex;
|
}
|
|
_logger.info("start lightRAG : " + _id);
|
}
|
}
|