首页 > 解决方案 > 如何使用 Confluent-Kafka-Go 创建窗口服务

问题描述

当我使用 golang.org/x/sys/windows/svc 将我的 api 创建为窗口服务时,我有一项服务。这很完美。我能够按照这个如何在 Windows #128 上使用 Golang 客户端进行操作。我可以随心所欲地消费、生产我的 api 工作。我可以同时使用这两个库,当我在调试模式下运行服务时,一切都很好。但是当 api 是一个窗口服务时,服务不启动我收到 1053 错误消息。我正在运行几个测试,我可以说当我使用融合库时该服务不起作用。我知道因为这个库不支持窗口,所以当 .exe 作为服务运行时会丢失一些东西,但我可以弄清楚它是什么。

如何重现我在主项目之外制作了一个小程序。只需从这里 golang.org/x/sys/windows/svc 复制并粘贴示例,然后从 confluent 添加一个使用者。

    if _, err := os.Stat(".\LOGSmsPrueba\"); os.IsNotExist(err) {
    os.MkdirAll(".\LOGSmsPrueba\", 0700)
    }
    filelogs, _ := os.OpenFile(".\LOGSmsPrueba\LOGS.log", os.O_APPEND|os.O_CREATE|os.O_RDWR, 
    0644)
    
    defer filelogs.Close()
    
    log := zerolog.New(filelogs).With().Logger()
    log.Debug().Msg("Before The Thread Of Consumer")
    go func() {
    
        log := zerolog.New(filelogs).With().Logger()
    
        kafkaservice.ConsumidorKafka(&log)
    }()
    
    changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
    loop:
    for {
    select {
    
        case c := <-r:
            switch c.Cmd {
            case svc.Interrogate:
                changes <- c.CurrentStatus
            
                time.Sleep(100 * time.Millisecond)
                changes <- c.CurrentStatus
            case svc.Stop, svc.Shutdown:
            
                testOutput := strings.Join(args, "-")
                testOutput += fmt.Sprintf("-%d", c.Context)
                elog.Info(1, testOutput)
                break loop
            case svc.Pause:
                changes <- svc.Status{State: svc.Paused, Accepts: cmdsAccepted}
    
            case svc.Continue:
                changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
    
            default:
                elog.Error(1, fmt.Sprintf("unexpected control request #%d", c))
            }
        }
    }
    changes <- svc.Status{State: svc.StopPending}
    return

清单

librdkafka 版本:1.7.0 confluent-kafka-go 版本:1.7.0 golang.org/x/sys v0.0.0-20210615035016

标签: goapache-kafkawindow

解决方案


最后我让它工作了。唯一缺少的部分是以这样的静态方式编译 => go build -ldflags '-extldflags "-static"'。这解决了缺少 dll 的问题,问题是在控制台上一切正常。我从来没有看到丢失的dll。但是当我在 Windows Server 2016 上工作时,控制台没有运行。具体的错误是“运行bin文件系统错误”libwinpthread-1.dll未找到“。我用静态编译修复了这个问题,然后回来证明这个编译的窗口服务。最后我让我的go服务作为窗口运行服务和使用融合的 kafka 库。


推荐阅读