Dalam artikel ini, kita akan membahas tentang manajemen serviser dalam bahasa pemrograman Golang. Manajemen serviser adalah sebuah konsep yang digunakan untuk mengatur dan mengontrol berbagai serviser yang terhubung dengan sistem.
Struktur Data
Pada awalnya, kita memiliki struktur data Manager
yang berisi beberapa variabel, seperti:
type Manager struct {
strReceiver chan group.StringRespMessage
// 管理的群组
managedGroups []string
// 同步的 lock
serviceLock sync.Mutex
}
Fungsi-Fungsi
Dalam manajemen serviser, kita memiliki beberapa fungsi yang digunakan untuk mengatur dan mengontrol berbagai serviser. Fungsi-fungsi tersebut adalah:
AddService
: Fungsi ini digunakan untuk menambahkan sebuah serviser ke dalam sistem.
func (manager *Manager) AddService(servicer Servicer, name string) {
manager.serviceLock.Lock()
defer manager.serviceLock.Unlock()
manager.serviceMap[name] = servicer
servicer.SetOutchan(&manager.strReceiver)
go servicer.Run()
}
RemoveService
: Fungsi ini digunakan untuk menghapus sebuah serviser dari sistem.
func (manager *Manager) RemoveService(name string) bool {
manager.serviceLock.Lock()
defer manager.serviceLock.Unlock()
servicer, ok := manager.serviceMap[name]
delete(manager.serviceMap, name)
servicer.Stop()
return ok
}
Serviser
Sebuah serviser adalah sebuah entitas yang memiliki beberapa fungsi, seperti:
GetChan
: Fungsi ini digunakan untuk mendapatkan channel output dari serviser.IfAcceptMessage
: Fungsi ini digunakan untuk menentukan apakah serviser dapat menerima pesan.PutRequest
: Fungsi ini digunakan untuk memasukkan sebuah pesan ke dalam serviser.SetOutchan
: Fungsi ini digunakan untuk mengatur channel output dari serviser.SendData
: Fungsi ini digunakan untuk mengirimkan data ke kanal output.
Kita juga memiliki beberapa serviser yang berbeda, seperti:
Subscribe
: Serviser ini digunakan untuk menerima pesan RSS dan tidak dapat menerima input lainnya.WeiboService
: Serviser ini digunakan untuk mengumpulkan berita dari Weibo dan mengirimkannya ke kanal output.
Fungsi Run
Fungsi Run
digunakan untuk menjalankan sebuah serviser. Fungsi ini akan dijalankan secara paralel dengan fungsi lainnya.
func (self *WeiboService) Run() {
fp := gofeed.NewParser()
feed, err := fp.ParseURL(self.ServiceUrl)
if err != nil {
panic(err.Error())
}
newest := feed.Items[0]
title := feed.Title
// InChan 被 close 会终止
for true {
// 10 分钟一次
time.Sleep(time.Minute * 10)
feed, _ := fp.ParseURL(self.ServiceUrl)
if feed.Items == nil {
fmt.Println("Feed.Items is nil!")
}
for _, item := range feed.Items {
if item == nil {
fmt.Println("item is nil here")
}
if item.Title == newest.Title {
newest = item
break
} else {
Resp := buildService(item, title)
*self.OutChan <- Resp
}
}
}
}
Parsings Data
Golang menggunakan JSON dan tag untuk parsing data. Contohnya, kita dapat mendefinisikan struktur data seperti berikut:
type ArrayRespMessage struct {
GroupID string `json:"group_id"`
Message message.Message `json:"message"`
AutoEscape bool `json:"auto_escape"`
}
// 定义的 QQ 消息的数据结构, 表示单条的消息
type MessageData struct {
// field for file
File string `json:"file,omitempty"`
Url string `json:"url,omitempty"`
// field for text
Text string `json:"text,omitempty"`
// field for face
Id string `json:"id,omitempty"`
// field for at
QQ string `json:"qq"`
}
type MessageSegment struct {
Type string `json:"type,omitempty"`
// may be message type ?
Data MessageData `json:"data,omitempty"`
}
type Message []MessageSegment
Golang akan secara otomatis parsing data untuk kita.