rocketmq_model/common/message/
message_envelope.rs1use std::collections::HashMap;
16use std::fmt;
17use std::fmt::Display;
18use std::net::SocketAddr;
19
20use bytes::Bytes;
21use cheetah_string::CheetahString;
22
23use crate::common::message::message_client_id_setter::MessageClientIDSetter;
24use crate::common::message::message_single::Message;
25use crate::common::message::routing_context::RoutingContext;
26use crate::common::message::storage_metadata::StorageMetadata;
27use crate::common::message::MessageTrait;
28
29#[derive(Clone, Debug)]
40pub struct MessageEnvelope {
41 message: Message,
43
44 routing: RoutingContext,
46
47 storage: StorageMetadata,
49
50 msg_id: CheetahString,
52
53 body_crc: u32,
55
56 reconsume_times: i32,
58
59 prepared_transaction_offset: i64,
61}
62
63impl MessageEnvelope {
64 #[allow(clippy::too_many_arguments)]
66 pub fn new(
67 message: Message,
68 routing: RoutingContext,
69 storage: StorageMetadata,
70 msg_id: CheetahString,
71 body_crc: u32,
72 reconsume_times: i32,
73 prepared_transaction_offset: i64,
74 ) -> Self {
75 Self {
76 message,
77 routing,
78 storage,
79 msg_id,
80 body_crc,
81 reconsume_times,
82 prepared_transaction_offset,
83 }
84 }
85
86 #[inline]
90 pub fn message(&self) -> &Message {
91 &self.message
92 }
93
94 #[inline]
96 pub fn message_mut(&mut self) -> &mut Message {
97 &mut self.message
98 }
99
100 #[inline]
102 pub fn topic(&self) -> &CheetahString {
103 self.message.topic()
104 }
105
106 #[inline]
108 pub fn body(&self) -> Option<Bytes> {
109 self.message.body()
110 }
111
112 #[inline]
114 pub fn properties(&self) -> &HashMap<CheetahString, CheetahString> {
115 self.message.properties().as_map()
116 }
117
118 #[inline]
120 pub fn tags(&self) -> Option<CheetahString> {
121 self.message.get_tags()
122 }
123
124 #[inline]
126 pub fn keys(&self) -> Option<Vec<String>> {
127 self.message.keys()
128 }
129
130 #[inline]
132 pub fn flag(&self) -> i32 {
133 self.message.flag()
134 }
135
136 #[inline]
140 pub fn routing(&self) -> &RoutingContext {
141 &self.routing
142 }
143
144 #[inline]
146 pub fn born_host(&self) -> SocketAddr {
147 self.routing.born_host()
148 }
149
150 #[inline]
152 pub fn born_timestamp(&self) -> i64 {
153 self.routing.born_timestamp()
154 }
155
156 #[inline]
158 pub fn sys_flag(&self) -> i32 {
159 self.routing.sys_flag()
160 }
161
162 #[inline]
164 pub fn born_host_bytes(&self) -> Bytes {
165 self.routing.born_host_bytes()
166 }
167
168 #[inline]
172 pub fn storage(&self) -> &StorageMetadata {
173 &self.storage
174 }
175
176 #[inline]
178 pub fn broker_name(&self) -> &str {
179 self.storage.broker_name()
180 }
181
182 #[inline]
184 pub fn queue_id(&self) -> i32 {
185 self.storage.queue_id()
186 }
187
188 #[inline]
190 pub fn queue_offset(&self) -> i64 {
191 self.storage.queue_offset()
192 }
193
194 #[inline]
196 pub fn commit_log_offset(&self) -> i64 {
197 self.storage.commit_log_offset()
198 }
199
200 #[inline]
202 pub fn store_timestamp(&self) -> i64 {
203 self.storage.store_timestamp()
204 }
205
206 #[inline]
208 pub fn store_host(&self) -> SocketAddr {
209 self.storage.store_host()
210 }
211
212 #[inline]
214 pub fn store_size(&self) -> i32 {
215 self.storage.store_size()
216 }
217
218 #[inline]
220 pub fn store_host_bytes(&self) -> Bytes {
221 self.storage.store_host_bytes()
222 }
223
224 #[inline]
228 pub fn msg_id(&self) -> &CheetahString {
229 &self.msg_id
230 }
231
232 pub fn client_msg_id(&self) -> CheetahString {
236 MessageClientIDSetter::get_uniq_id(self).unwrap_or_else(|| self.msg_id.clone())
237 }
238
239 #[inline]
241 pub fn body_crc(&self) -> u32 {
242 self.body_crc
243 }
244
245 #[inline]
247 pub fn reconsume_times(&self) -> i32 {
248 self.reconsume_times
249 }
250
251 #[inline]
253 pub fn prepared_transaction_offset(&self) -> i64 {
254 self.prepared_transaction_offset
255 }
256}
257
258impl Default for MessageEnvelope {
259 fn default() -> Self {
260 Self {
261 message: Message::default(),
262 routing: RoutingContext::default(),
263 storage: StorageMetadata::default(),
264 msg_id: CheetahString::new(),
265 body_crc: 0,
266 reconsume_times: 0,
267 prepared_transaction_offset: 0,
268 }
269 }
270}
271
272impl Display for MessageEnvelope {
273 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
274 write!(
275 f,
276 "MessageEnvelope {{ topic: {}, queue_id: {}, queue_offset: {}, commit_log_offset: {}, msg_id: {}, \
277 reconsume_times: {} }}",
278 self.topic(),
279 self.queue_id(),
280 self.queue_offset(),
281 self.commit_log_offset(),
282 self.msg_id,
283 self.reconsume_times
284 )
285 }
286}
287
288impl crate::common::message::MessageTrait for MessageEnvelope {
290 fn put_property(&mut self, key: CheetahString, value: CheetahString) {
291 self.message.put_property(key, value);
292 }
293
294 fn clear_property(&mut self, name: &str) {
295 self.message.clear_property(name);
296 }
297
298 fn property(&self, name: &CheetahString) -> Option<CheetahString> {
299 self.message.get_property(name)
300 }
301
302 fn property_ref(&self, name: &CheetahString) -> Option<&CheetahString> {
303 self.message.property_ref(name)
304 }
305
306 fn topic(&self) -> &CheetahString {
307 self.topic()
308 }
309
310 fn set_topic(&mut self, topic: CheetahString) {
311 self.message.set_topic(topic);
312 }
313
314 fn get_flag(&self) -> i32 {
315 self.flag()
316 }
317
318 fn set_flag(&mut self, flag: i32) {
319 self.message.set_flag(flag);
320 }
321
322 fn get_body(&self) -> Option<&Bytes> {
323 self.message.get_body()
324 }
325
326 fn set_body(&mut self, body: Bytes) {
327 self.message.set_body(Some(body));
328 }
329
330 fn get_properties(&self) -> &HashMap<CheetahString, CheetahString> {
331 self.properties()
332 }
333
334 fn set_properties(&mut self, properties: HashMap<CheetahString, CheetahString>) {
335 self.message.set_properties(properties);
336 }
337
338 fn transaction_id(&self) -> Option<&CheetahString> {
339 MessageTrait::transaction_id(&self.message)
340 }
341
342 fn set_transaction_id(&mut self, transaction_id: CheetahString) {
343 self.message.set_transaction_id(transaction_id);
344 }
345
346 fn get_compressed_body_mut(&mut self) -> Option<&mut Bytes> {
347 self.message.get_compressed_body_mut()
348 }
349
350 fn get_compressed_body(&self) -> Option<&Bytes> {
351 self.message.get_compressed_body()
352 }
353
354 fn set_compressed_body_mut(&mut self, compressed_body: Bytes) {
355 self.message.set_compressed_body_mut(compressed_body);
356 }
357
358 fn take_body(&mut self) -> Option<Bytes> {
359 self.message.take_body()
360 }
361
362 fn as_any(&self) -> &dyn std::any::Any {
363 self
364 }
365
366 fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
367 self
368 }
369}
370
371#[cfg(test)]
372mod tests {
373 use super::*;
374
375 fn create_test_envelope() -> MessageEnvelope {
376 let message = Message::default();
377 let routing = RoutingContext::default();
378 let storage = StorageMetadata::default();
379
380 MessageEnvelope::new(
381 message,
382 routing,
383 storage,
384 CheetahString::from_static_str("test-msg-id"),
385 12345,
386 0,
387 0,
388 )
389 }
390
391 #[test]
392 fn test_envelope_creation() {
393 let envelope = create_test_envelope();
394 assert_eq!(envelope.msg_id().as_str(), "test-msg-id");
395 assert_eq!(envelope.body_crc(), 12345);
396 assert_eq!(envelope.reconsume_times(), 0);
397 }
398
399 #[test]
400 fn test_message_access() {
401 let envelope = create_test_envelope();
402 let _message = envelope.message();
403 let _topic = envelope.topic();
404 let _body = envelope.body();
405 let _properties = envelope.properties();
406 }
407
408 #[test]
409 fn test_routing_access() {
410 let envelope = create_test_envelope();
411 let _born_host = envelope.born_host();
412 let _born_timestamp = envelope.born_timestamp();
413 let _sys_flag = envelope.sys_flag();
414 }
415
416 #[test]
417 fn test_storage_access() {
418 let envelope = create_test_envelope();
419 let _broker_name = envelope.broker_name();
420 let _queue_id = envelope.queue_id();
421 let _queue_offset = envelope.queue_offset();
422 let _commit_log_offset = envelope.commit_log_offset();
423 }
424
425 #[test]
426 fn test_display() {
427 let envelope = create_test_envelope();
428 let display_str = format!("{}", envelope);
429 assert!(display_str.contains("MessageEnvelope"));
430 assert!(display_str.contains("test-msg-id"));
431 }
432}