forked from didapinchegit/go_rocket_mq
-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathmessage_client_id_setter.go
65 lines (54 loc) · 1.77 KB
/
message_client_id_setter.go
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
package rocketmq
import (
"bytes"
"encoding/binary"
"os"
"time"
)
type messageClientIDSetter struct {
counter int
basePos int
startTime int64
nextStartTime int64
stringBuilder *bytes.Buffer // ip + pid + classloaderid + counter + time
buffer *bytes.Buffer
}
var stringBuilder = bytes.NewBuffer([]byte{})
func init() {
binary.Write(stringBuilder, binary.BigEndian, GetLocalIp4()) // 4
binary.Write(stringBuilder, binary.BigEndian, os.Getpid()) // 2
binary.Write(stringBuilder, binary.BigEndian, hashCode()) // 4
MessageClientIDSetter.stringBuilder = stringBuilder
MessageClientIDSetter.setStartTime()
}
var MessageClientIDSetter = messageClientIDSetter{
stringBuilder: bytes.NewBuffer([]byte{}), // length := 4 + 2 + 4 + 4 + 2
basePos: stringBuilder.Len() * 2,
counter: 0,
}
func hashCode() []byte {
tmpByte := []byte{1, 1, 1, 1}
return tmpByte
}
func (m messageClientIDSetter) setUniqID(msg *Message) {
if msg.Properties[MessageConst.PropertyUniqClientMessageIdKeyidx] == "" {
msg.Properties[MessageConst.PropertyUniqClientMessageIdKeyidx] = m.createUniqID()
}
}
func (m messageClientIDSetter) getUniqID(msg *Message) string {
return msg.Properties[MessageConst.PropertyUniqClientMessageIdKeyidx]
}
func (m messageClientIDSetter) createUniqID() string {
current := time.Now().UnixNano()
if current > m.nextStartTime {
m.setStartTime()
}
binary.Write(m.stringBuilder, binary.BigEndian, time.Now().UnixNano()-m.startTime)
m.counter++
binary.Write(m.stringBuilder, binary.BigEndian, m.counter)
return m.stringBuilder.String()
}
func (m messageClientIDSetter) setStartTime() {
m.startTime = time.Now().UnixNano()
m.nextStartTime = time.Now().UnixNano() + 2592000000000000 // next 30 days, 3600 * 24 * 30 * 1000 * 1000 *1000
}