52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
||
|
|
"""
|
||
|
|
消息数据模型
|
||
|
|
统一所有中间件的消息格式
|
||
|
|
"""
|
||
|
|
|
||
|
|
import time
|
||
|
|
import uuid
|
||
|
|
from dataclasses import dataclass, field
|
||
|
|
from enum import Enum
|
||
|
|
from typing import Any, Dict, Optional
|
||
|
|
|
||
|
|
|
||
|
|
class MessagePriority(Enum):
|
||
|
|
LOW = 0
|
||
|
|
NORMAL = 1
|
||
|
|
HIGH = 2
|
||
|
|
URGENT = 3
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class Message:
|
||
|
|
"""统一消息体"""
|
||
|
|
topic: str
|
||
|
|
payload: Any
|
||
|
|
msg_id: str = field(default_factory=lambda: str(uuid.uuid4()))
|
||
|
|
timestamp: float = field(default_factory=time.time)
|
||
|
|
headers: Dict[str, str] = field(default_factory=dict)
|
||
|
|
priority: MessagePriority = MessagePriority.NORMAL
|
||
|
|
reply_to: Optional[str] = None # 用于 Request/Reply 模式
|
||
|
|
correlation_id: Optional[str] = None
|
||
|
|
|
||
|
|
def to_dict(self) -> dict:
|
||
|
|
return {
|
||
|
|
"msg_id": self.msg_id,
|
||
|
|
"topic": self.topic,
|
||
|
|
"payload": self.payload,
|
||
|
|
"timestamp": self.timestamp,
|
||
|
|
"headers": self.headers,
|
||
|
|
"priority": self.priority.value,
|
||
|
|
"reply_to": self.reply_to,
|
||
|
|
"correlation_id": self.correlation_id,
|
||
|
|
}
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def from_dict(cls, data: dict) -> "Message":
|
||
|
|
data["priority"] = MessagePriority(data.get("priority", 1))
|
||
|
|
return cls(**{k: v for k, v in data.items() if k in cls.__dataclass_fields__})
|
||
|
|
|
||
|
|
def __repr__(self):
|
||
|
|
return (f"Message(id={self.msg_id[:8]}..., topic={self.topic!r}, "
|
||
|
|
f"priority={self.priority.name})")
|