ソースを参照

bug fix in startJob, we should not assign s back to m.sessions[openID] as it conflicts with sessionmanager with 'counter' attribute.

but for session data, it should be fine, as it is only loaded once, and sequentially handled by each openID.
master
Patrick Peng Sun 8年前
コミット
dc51f0d3f2
3個のファイルの変更36行の追加22行の削除
  1. +9
    -7
      eventSubscribe.go
  2. +19
    -15
      sessionManager.go
  3. +8
    -0
      sync_wechat_token.sh

+ 9
- 7
eventSubscribe.go ファイルの表示

@@ -11,7 +11,9 @@ import (
func onSubscribe(in InWechatMsg) {
openID := in.header.FromUserName
//getUser fromCRM
log.Println(openID)
info := WechatUserInfo{}
info.getUserInfo(in.header.FromUserName, "zh-CN")
log.Println(openID + " information get above onSubscribe")
}

//WechatUserInfo response for wechat user info.
@@ -19,7 +21,7 @@ type WechatUserInfo struct {
Subscribe int32 `json:"subscribe"`
OpenID string `json:"openid"`
NickName string `json:"nickname"`
Sex int32 `json:"sex"`
Sex int32 `json:"sex"` //0 未知 1 男 2 女
Language string `json:"language"`
City string `json:"city"`
Province string `json:"province"`
@@ -32,16 +34,16 @@ type WechatUserInfo struct {
TagIDList []int32 `json:"tagid_list"`
}

func getUserInfo(openID string, lang string) (result WechatUserInfo) {
url := result.getURL(openID, lang)
func (m *WechatUserInfo) getUserInfo(openID string, lang string) {
url := m.getURL(openID, lang)
resp, err := http.Get(url)
if err != nil {
}
b, err := ioutil.ReadAll(resp.Body)
err = json.Unmarshal(b, &result)
return
err = json.Unmarshal(b, m)
log.Println(m)
}
//lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
func (m *WechatUserInfo) getURL(openID, lang string) string {
atk, _ := GetAccessToken()
u := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=%s", atk, openID, lang)

+ 19
- 15
sessionManager.go ファイルの表示

@@ -37,8 +37,8 @@ var AllInMessage chan InWechatMsg
func (m *SessionManager) startSessionManager(in <-chan InWechatMsg) {
log.Println("session manager start..")
m.sessions = map[string]openIDSession{}
m.done = make(chan workDone, 2000)
for { //forever looping
m.done = make(chan workDone, 2000) //2000 different openID simultaneously.
for { //forever looping
select {
case msg := <-in:
log.Printf("SessionMgr : incoming msg %s (%s)", msg.header.FromUserName, msg.header.MsgType)
@@ -67,10 +67,10 @@ func (m *SessionManager) addJob(v InWechatMsg) (jobCount int) {
s.count++
m.sessions[openID] = s

log.Printf("Incoming message in queue %d", s.count)
log.Printf("Total Session count = %d", len(m.sessions))
log.Printf("SessionMgr/addJob: Incoming message in queue %d", s.count)
log.Printf("SessionMgr/addJob: Total Session count = %d", len(m.sessions))
if s.count <= 0 {
log.Fatal("new job added, but count <= 0")
log.Fatal("SessionMgr/Addjob: new job added, but count <= 0")
}
return s.count
}
@@ -88,22 +88,25 @@ func (m *SessionManager) createSession(openID string) openIDSession {

func (m *SessionManager) clearJobDone(d workDone) {
s, found := m.sessions[d.openID]
log.Println("SessionMgr/clearJobDone: start clearning jobs ... ")
log.Println(s)
log.Println(d)
if found {
s.count -= d.consumed
if s.count == 0 { //no job to do
m.sessions[d.openID] = s //update
if s.count == 0 { //no job to do
//remove from memory
m.destroySession(d.openID)
log.Printf("destroy session %s", d.openID)
log.Printf("SessionMgr/clearJobDone: destroy session %s", d.openID)
} else if s.count > 0 {
go m.startJob(d.openID) //processing any newly coming jobs
} else {
log.Println(s)
log.Fatal("session job count cannot be negative, problem session")
log.Fatal("SessionMgr/clearJobDone: session job count cannot be negative, problem session")
}
} else {
log.Println(d)
log.Fatal("When job done, we canot find proper session")
log.Fatal("SessionMgr/clearJobDone: When job done, we canot find proper session")
}
}

@@ -117,12 +120,12 @@ func (m *SessionManager) destroySession(openID string) {
close(s.jobs)
//delete it from memory
delete(m.sessions, openID)
log.Printf("total session count=%d", len(m.sessions))
log.Printf("SessionMgr/destroySession: total session count=%d", len(m.sessions))
}

//worker thread
//worker thread, cannot change session info
func (m *SessionManager) startJob(openID string) {
log.Println("start job worker...")
log.Println("SessionMgr/startJob: enter...")
jobFinished := workDone{openID, 0}
//process all jobs in the channel
hasJob := true
@@ -132,7 +135,8 @@ func (m *SessionManager) startJob(openID string) {
m.checkOpenID(openID, v)
s := m.sessions[openID]
s.data.incomingMsg(v) //<=== main logic for processing each incoming message
m.sessions[openID] = s
log.Println("in worker thread, set s to session")
log.Println(s)
jobFinished.consumed++
default:
hasJob = false
@@ -144,8 +148,8 @@ func (m *SessionManager) startJob(openID string) {

func (m *SessionManager) checkOpenID(openID string, v InWechatMsg) {
if v.header.FromUserName != openID {
log.Println("Error: Weird Message below ...")
log.Println("Error:[SessionMgr/checkOpenID] Weird Message below ...")
log.Println(v)
log.Fatalf("Error: worker thread for %s, see different id=%s \n", openID, v.header.FromUserName)
log.Fatalf("Error:[[SessionMgr/checkOpenID]] worker thread for %s, see different id=%s \n", openID, v.header.FromUserName)
}
}

+ 8
- 0
sync_wechat_token.sh ファイルの表示

@@ -0,0 +1,8 @@
#!/bin/bash
FILE=`find /tmp -path "/tmp/ssh-*" -user sp -type s -iname "agent.*" 2>/dev/null`
export SSH_AUTH_SOCK="$FILE"

#download
SSH_AUTH_SOCK="$FILE" rsync --update root@biukop.com.au:/tmp/wechat_hitxy_token /tmp/wechat_hitxy_token
#upload
SSH_AUTH_SOCK="$FILE" rsync --update /tmp/wechat_hitxy_token root@biukop.com.au:/tmp/wechat_hitxy_token

読み込み中…
キャンセル
保存