go - 如何使用 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
解决方案
最后我让它工作了。唯一缺少的部分是以这样的静态方式编译 => go build -ldflags '-extldflags "-static"'。这解决了缺少 dll 的问题,问题是在控制台上一切正常。我从来没有看到丢失的dll。但是当我在 Windows Server 2016 上工作时,控制台没有运行。具体的错误是“运行bin文件系统错误”libwinpthread-1.dll未找到“。我用静态编译修复了这个问题,然后回来证明这个编译的窗口服务。最后我让我的go服务作为窗口运行服务和使用融合的 kafka 库。
推荐阅读
- python - 特殊移动平均线
- vba - 使用 ItemAdd 事件将邮件项移动/复制到文件夹会生成错误
- c# - 如何在 WPF 中显示和绑定数据属性的变量编号(和类型)
- web-services - MSI 安装成功但未安装服务,事件日志中出现 MsiExec 错误
- excel - 更好的做事方式?VBA
- java - 将文件上传到只能通过另一个 SSH/SFTP 服务器访问的 SFTP 服务器
- ios - 我应该在 iPhone X 和 iPhone 8 Plus 中选择哪些@3x 图片
- c++ - C++ 正则表达式从字符串中提取所有可能的 10 位数字
- android - 在用户滑动删除应用程序之前删除文件
- html - 如何在 HTML FlexBox 中将文本与换行符右对齐