当我使用golang.org/x/sys/windows/svc创建我的api作为窗口服务时,我有一个服务。这个很好用。我能够遵循这个如何在Windows #128上使用Golang客户端,这就是工作。我可以随心所欲地消费和生产我的api作品。我可以使用这两个库,并且当我在调试模式下运行服务时,一切正常。但是当api是一个窗口服务时,服务不会启动,我得到了一个1053错误信息。我运行了几个测试,当我使用confluent库时,我可以说服务不工作。我知道,因为这个库不支持window,所以当.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
发布于 2021-06-29 00:03:41
最后我让它起作用了。唯一缺少的部分是以静态方式编译,像这样的=> go build -ldflags‘-extldflag "-static"’。这修复了缺少dll的问题,问题是在控制台上一切工作正常。我从未见过丢失的dll。但是当我在window server 2016上工作时,控制台并没有运行。具体的错误是"Run bin file Systerm Error "libwinpthread-1.dll as not file“。我用静态编译解决了这个问题,回来也用这个编译证明了window服务。最后我让我的go服务作为窗口服务运行,并使用confluent kafka库。
https://stackoverflow.com/questions/68020189
复制相似问题