TangCheng
3 天以前 af9b852005fbdd493654e94ddbff5b9261fdb64b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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);
    }
}