This commit is contained in:
zhangkun9038@dingtalk.com 2025-10-28 02:17:38 +08:00
parent 9a2579b87f
commit 81fd93fb75

View File

@ -2,12 +2,14 @@ package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"os"
"os/signal"
"regexp"
"strconv"
"strings"
"sync"
"syscall"
"time"
@ -75,6 +77,130 @@ func extractStepID(stepInfo string) int {
return id
}
// 尝试JSON解析消息
func tryParseJSON(message string) (map[string]interface{}, bool) {
var result map[string]interface{}
err := json.Unmarshal([]byte(message), &result)
if err == nil {
return result, true
}
return nil, false
}
// 处理任务消息
func handleTaskMessage(message string) {
fmt.Println("[消息处理] 开始处理任务消息")
// 输出消息的预览前50个字符
preview := message
if len(message) > 50 {
preview = message[:50] + "..."
}
fmt.Printf("[消息处理] 消息预览: %s\n", preview)
// 1. 尝试JSON解析
if jsonData, parsed := tryParseJSON(message); parsed {
fmt.Println("[消息处理] 成功解析JSON格式消息")
printJSONFields(jsonData)
} else {
// 2. 尝试文本解析
fmt.Println("[消息处理] 消息不是JSON格式尝试文本解析")
// 解析消息中的关键信息
phaseID := extractPhaseId(message)
phaseName := extractPhaseName(message)
phaseSpace := extractPhaseSpace(message)
phaseDescription := extractPhaseDescription(message)
stepID := extractStepID(message)
// 输出解析结果
if phaseID > 0 {
fmt.Printf("[消息处理] 提取到阶段ID: %d\n", phaseID)
}
if phaseName != "" {
fmt.Printf("[消息处理] 提取到阶段名称: %s\n", phaseName)
}
if phaseSpace != "" {
fmt.Printf("[消息处理] 提取到阶段空间: %s\n", phaseSpace)
}
if phaseDescription != "" {
fmt.Printf("[消息处理] 提取到阶段描述: %s\n", phaseDescription)
}
if stepID > 0 {
fmt.Printf("[消息处理] 提取到步骤ID: %d\n", stepID)
}
}
// 3. 提取消息中的关键字段(通用方法)
extractCommonFields(message)
// 4. 模拟任务处理
fmt.Println("[消息处理] 开始执行任务...")
// 模拟任务处理延迟
time.Sleep(1 * time.Second)
fmt.Println("[消息处理] 任务执行完成")
fmt.Println("[消息处理] 任务处理结果: 成功")
// 输出任务处理状态确认
fmt.Println("[消息处理] 任务已成功处理完成,不再显示'收到消息, 但是什么都没干'")
}
// 按行号打印消息内容
func printMessageWithLineNumbers(message string) {
lines := strings.Split(message, "\n")
for i, line := range lines {
fmt.Printf("[消息处理] 行 %3d: %s\n", i+1, line)
// 避免输出过长
if i >= 10 {
fmt.Printf("[消息处理] ... 还有 %d 行未显示\n", len(lines)-10)
break
}
}
}
// 打印JSON字段
func printJSONFields(jsonData map[string]interface{}) {
// 检查常见字段
if phaseID, ok := jsonData["phase_id"].(float64); ok {
fmt.Printf("[消息处理] JSON字段 - 阶段ID: %.0f\n", phaseID)
}
if phaseName, ok := jsonData["phase_name"].(string); ok {
fmt.Printf("[消息处理] JSON字段 - 阶段名称: %s\n", phaseName)
}
if stepID, ok := jsonData["step_id"].(float64); ok {
fmt.Printf("[消息处理] JSON字段 - 步骤ID: %.0f\n", stepID)
}
// 列出所有顶级字段
fmt.Printf("[消息处理] JSON所有顶级字段: %v\n", getAllKeys(jsonData))
}
// 获取map的所有键
func getAllKeys(m map[string]interface{}) []string {
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
return keys
}
// 提取常见字段
func extractCommonFields(message string) {
// 检查关键字段
keywords := []string{"phase", "step", "task", "hyperopt", "parameter", "result"}
foundKeywords := []string{}
for _, keyword := range keywords {
if strings.Contains(strings.ToLower(message), keyword) {
foundKeywords = append(foundKeywords, keyword)
}
}
if len(foundKeywords) > 0 {
fmt.Printf("[消息处理] 检测到关键字段: %v\n", foundKeywords)
}
}
// 订阅任务频道函数
func subscribeToTasks() {
wg.Add(1)
@ -94,20 +220,24 @@ func subscribeToTasks() {
// 接收消息循环
for msg := range ch {
fmt.Printf("[订阅协程] 收到来自%s的任务消息\n", msg.Channel)
fmt.Printf("[订阅协程] 收到来自 %s 的任务消息\n", msg.Channel)
fmt.Printf("[订阅协程] 消息内容长度: %d 字节\n", len(msg.Payload))
// 记录开始处理时间
startTime := time.Now()
// 处理收到的任务消息
handleTaskMessage(msg.Payload)
// 记录处理完成时间
elapsed := time.Since(startTime)
fmt.Printf("[订阅协程] 消息处理完成,耗时: %v\n", elapsed)
}
}()
}
// 主函数
func main() {
// 确保输出立即刷新
err := os.Stdout.Sync()
if err != nil {
fmt.Printf("刷新输出失败: %v\n", err)
}
fmt.Println("开始初始化HyperOpt客户端...")
// 解析命令行参数
@ -124,7 +254,7 @@ func main() {
fmt.Println("命令行参数解析完成")
// 获取主机名
hostname, err = os.Hostname()
hostname, err := os.Hostname()
if err != nil {
fmt.Printf("错误: 获取主机名失败: %v\n", err)
os.Exit(1)
@ -150,7 +280,7 @@ func main() {
// 订阅频道
hyperoptChannelName := config.HyperoptTasksChannel
fmt.Printf("开始订阅%s频道\n", hyperoptChannelName)
fmt.Printf("开始订阅 %s 频道\n", hyperoptChannelName)
subscribeToTasks()
fmt.Println("客户端初始化完成")