Blame view

src/services/globald.lua 2.54 KB
314bc5df   zhengshouren   提交服务器初始代码
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
  local skynet = require "skynet"
  local harbor = require "skynet.harbor"
  local json = require("shared.json")
  local redisproxy = require("shared.redisproxy")
  
  require "shared.init"
  require "utils.init"
  require "RedisKeys"
  require "skynet.manager"
  
  local ipairs = ipairs
  local table_insert = table.insert
  local tarr2tab = table.array2Table
  local string_format = string.format
  
  local pointDataMark = {}
  local utils = {}
  
  local CHECK_MAIL_STATUS_INTERVAL 	= 60
  
  local function mailQuene()
  	local delayEmail = tonum(redisproxy:hget("autoincrement_set", "delay_email"))
  	if delayEmail == 0 then
  		return
  	end
  	local begin = math.max(delayEmail - 100, 1)
  	local mails = redisproxy:pipelining(function (red)
  		for id = begin, delayEmail do
  			red:hgetall(string.format("delayEmail:%s", id))
  		end
  	end)
  	if not mails then
  		return
  	end
  	local now = skynet.timex()
  	local mailList = {}
  	for index, data in ipairs(mails) do
  		if next(data) then
  			local email = tarr2tab(data)
  			if tonum(email.startTime) <= now then
  				table_insert(mailList, email)
  
  				if #mailList > 100 then
  					break
  				end
  			end
  		end
  	end
  	if #mailList == 0 then
  		return
  	end
  	redisproxy:pipelining(function (red)
  		for _, email in ipairs(mailList) do
  			red:del(string_format("delayEmail:%s", email.id))
  		end
  	end)
  	table.sort(mailList, function(a, b)
  		return tonum(a.id) < tonum(b.id)
  	end)
  	for _, email in ipairs(mailList) do
  		local gid = redisproxy:hincrby("autoincrement_set", "email", 1)
  		if email.mid then
  			redisproxy:hmset(string_format("globalEmail:%s", gid), 
  				"id", gid,
  				"createtime", email.endTime,
  				"title", email.title,
  				"content", email.content,
  				"attachments", email.attachments,
  				"endtime", email.endTime,
  				"mid", email.mid,
  				"timestamp", email.startTime
  			)
  		else
  			redisproxy:hmset(string_format("globalEmail:%s", gid), 
  				"id", gid,
  				"createtime", email.endTime,
  				"title", email.title,
  				"content", email.content,
  				"attachments", email.attachments,
  				"endtime", email.endTime,
  				"timestamp", email.startTime
  			)
  		end
  	end
  	redisproxy:hset("autoincrement_set", "emailTimestamp", now)
  end
  
  -- @desc: 定时邮件队列检测
  local function check_mail_queue()
  	pcall(mailQuene)
  	skynet.timeout(CHECK_MAIL_STATUS_INTERVAL, check_mail_queue)
  end
  
  local CMD = {}
  function CMD.start()
  	check_mail_queue()
  end
  
  local function __init__()
  	skynet.dispatch("lua", function(_, _, command, ...)
  		if CMD[command] then
  			skynet.ret(skynet.pack(CMD[command](...)))
  		end
  	end)
  	redisd = harbor.queryname("REDIS")
  	skynet.register("GLOBALD")
  end
  
  skynet.start(__init__)