Manajemen Servicer dalam Golang

Manajemen Servicer dalam Golang

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.