diff --git a/include/agVstCli.hrl b/include/agVstCli.hrl index fbe4935..e7c09d9 100644 --- a/include/agVstCli.hrl +++ b/include/agVstCli.hrl @@ -4,8 +4,8 @@ -define(agBeamPool, agBeamPool). -define(agBeamAgency, agBeamAgency). --define(agMessageId, agMessageId). --define(agMaxMessageId, 576460752303423486). +%% HTTP 连接的保持活动超时由keep-alive-timeout(默认为300秒)控制 数据库安装后配置大一点 连接池进程默认半个小时发送一个续期请求 +-define(agKeepAliveTime, 3600000). -define(AgUndef, 0). %% Wait One Chunk start -define(AgCHeader, 1). %% Wait One Chunk header @@ -15,9 +15,6 @@ -define(AgCDone, 5). %% receve one Chunk done -define(AgMDone, 6). %% receve one message done -%% pidFrom pid() to reply; undefiend discard; timeOut 该请求标记为过期了 discard --record(msgIdCache, {pidFrom, timerRef, chunkCnt, msgBuffer}). - -define(AgMBIdx, 4). -define(AgCCIdx, 3). -define(AgTRIdx, 2). diff --git a/src/agVstCli/agSslAgency.erl b/src/agVstCli/agSslAgency.erl index 990ad7a..859a9e2 100644 --- a/src/agVstCli/agSslAgency.erl +++ b/src/agVstCli/agSslAgency.erl @@ -68,6 +68,7 @@ moduleInit(Parent, Args) -> {200, _BodyMap, _HeaderMap} -> NewSrvState = SrvState#srvState{dbName = DbName, reConnState = agAgencyUtils:resetReConnState(ReConnState), socket = Socket, vstSize = VstSize}, proc_lib:init_ack(Parent, {ok, self()}), + erlang:start_timer(?agKeepAliveTime, self(), keep_alive), ?MODULE:loop(Parent, NewSrvState, CliState); _Err -> proc_lib:init_ack(Parent, {error, _Err}), @@ -196,6 +197,15 @@ handleMsg({'$gen_call', FromTag, '$SrvInfo'}, SrvState, CliState) -> {To, Tag} = FromTag, catch To ! {Tag, {erlang:get(), SrvState, CliState}}, {ok, SrvState, CliState}; +handleMsg({timeout, _TimerRef, keep_alive}, #srvState{socket = Socket} = SrvState, #cliState{backlogNum = BacklogNum} = CliState) -> + case Socket /= undefined andalso BacklogNum =< 0 of + true -> + self() ! #agReq{method = ?AgGet, path = <<"/_admin/time">>, queryPars = ?AgDefQuery, headers = ?AgDefHeader, body = ?AgDefBody, messageId = agVstCli:getMsgId(), fromPid = undefined, overTime = infinity, isSystem = false}; + _ -> + ignore + end, + erlang:start_timer(?agKeepAliveTime, self(), keep_alive), + {ok, SrvState, CliState}; handleMsg(Msg, #srvState{serverName = ServerName} = SrvState, CliState) -> ?AgErr(ServerName, "unknown msg: ~p ~p ~p~n", [Msg, SrvState, CliState]), {ok, SrvState, CliState}. diff --git a/src/agVstCli/agTcpAgency.erl b/src/agVstCli/agTcpAgency.erl index 7aebb6a..24a01c2 100644 --- a/src/agVstCli/agTcpAgency.erl +++ b/src/agVstCli/agTcpAgency.erl @@ -68,6 +68,7 @@ moduleInit(Parent, Args) -> {200, _BodyMap, _HeaderMap} -> NewSrvState = SrvState#srvState{dbName = DbName, reConnState = agAgencyUtils:resetReConnState(ReConnState), socket = Socket, vstSize = VstSize}, proc_lib:init_ack(Parent, {ok, self()}), + erlang:start_timer(?agKeepAliveTime, self(), keep_alive), ?MODULE:loop(Parent, NewSrvState, CliState); _Err -> proc_lib:init_ack(Parent, {error, _Err}), @@ -201,6 +202,15 @@ handleMsg({'$gen_call', FromTag, '$SrvInfo'}, SrvState, CliState) -> {To, Tag} = FromTag, catch To ! {Tag, {erlang:get(), SrvState, CliState}}, {ok, SrvState, CliState}; +handleMsg({timeout, _TimerRef, keep_alive}, #srvState{socket = Socket} = SrvState, #cliState{backlogNum = BacklogNum} = CliState) -> + case Socket /= undefined andalso BacklogNum =< 0 of + true -> + self() ! #agReq{method = ?AgGet, path = <<"/_admin/time">>, queryPars = ?AgDefQuery, headers = ?AgDefHeader, body = ?AgDefBody, messageId = agVstCli:getMsgId(), fromPid = undefined, overTime = infinity, isSystem = false}; + _ -> + ignore + end, + erlang:start_timer(?agKeepAliveTime, self(), keep_alive), + {ok, SrvState, CliState}; handleMsg(Msg, #srvState{serverName = ServerName} = SrvState, CliState) -> ?AgErr(ServerName, "unknown msg: ~p ~p ~p~n", [Msg, SrvState, CliState]), {ok, SrvState, CliState}.