使用golang实现类java的netty异步通信编程,也即是回调通知基于事件的模型设计...

该博客介绍了如何使用Golang来实现一种类似于Java Netty的异步通信编程模型,主要通过回调通知的方式进行事件处理。示例代码中展示了创建HTTP服务,处理回调请求以及解析JSON数据并进行异步处理的流程。在dagScan函数中,通过读取通道获取结果,并根据结果进行相应的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码
package main
import (
    "encoding/json"
    "fmt"
    "net/http"
    "sync"
)
var dirEngineChan sync.Map
func main() {
    dHandler := dagHandler{}
    http.Handle("/v1/dagScan", dHandler)
    cHandler := callbackHandler{}
    http.Handle("/v1/callback", cHandler)
    http.ListenAndServe(":8080", nil)
}
type callbackHandler struct{}
func (h callbackHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
}
type dagHandler struct{}
func (h dagHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
    dag := `{
        "345": [
            {
                "f": "5"
            },
            {
                "a": "2",
                "w": "4"
            },
            {
                "p": "5"
            }
        ]
    }`
    go dagScan(dag)
    failStr := "message"
    data := []byte(failStr)
    res.WriteHeader(200)
    res.Write(data)
}
func dagScan(dag string) {
    var m map[string][]map[string]string
    json.Unmarshal([]byte(dag), &m)
    dagChan := make(chan interface{})
    for dirID, engineIpList := range m {
        for _, engineIpMap := range engineIpList {
            var chanList []interface{}
            for engine, ip := range engineIpMap {
                dirEngineChan.Store(dirID+engine, dagChan)
                resultChan, _ := dirEngineChan.Load(dirID + engine)
                chanList = append(chanList, resultChan)
                fmt.Println(dirID)
                fmt.Println(engine)
                fmt.Println(ip)
            }
            for _, readChan := range chanList {
                dirEngineResult := <-readChan.(chan interface{})
                if dirEngineResult != "ok" {
                    //del chan
                    //del the element key dirID+engine of map
                    fmt.Println("del the element key dirID+engine of map")
                }
            }
            fmt.Println()
            fmt.Println()
        }
    }
    //all done
    //del chan
    //del the key dirID+engine element of map
    //del the element of table vs_dirs
    fmt.Println("del the element of table vs_dirs")
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值