rocketmq_common/common/message/
message_ext_broker_inner.rs1use std::any::Any;
16use std::collections::HashMap;
17use std::fmt;
18use std::fmt::Debug;
19use std::fmt::Display;
20use std::fmt::Formatter;
21use std::net::SocketAddr;
22
23use bytes::Bytes;
24use cheetah_string::CheetahString;
25use rocketmq_rust::ArcMut;
26
27use crate::common::hasher::string_hasher::JavaStringHasher;
28use crate::common::message::message_decoder::message_properties_to_string;
29use crate::common::message::message_ext::MessageExt;
30use crate::common::message::message_single::Message;
31use crate::common::message::MessageTrait;
32use crate::common::message::MessageVersion;
33use crate::common::TopicFilterType;
34use crate::MessageUtils;
35
36#[derive(Default)]
37pub struct MessageExtBrokerInner {
38 pub message_ext_inner: MessageExt,
39 pub properties_string: CheetahString,
40 pub tags_code: i64,
41 pub encoded_buff: Option<bytes::BytesMut>,
42 pub encode_completed: bool,
43 pub version: MessageVersion,
44}
45
46impl MessageExtBrokerInner {
47 const VERSION: MessageVersion = MessageVersion::V1;
48
49 #[inline]
50 pub fn delete_property(&mut self, name: impl Into<CheetahString>) {
51 let name = name.into();
52 self.message_ext_inner.message.clear_property(name.as_str());
53 self.properties_string = CheetahString::from_string(MessageUtils::delete_property(
54 self.properties_string.as_str(),
55 name.as_str(),
56 ));
57 }
58
59 #[inline]
60 pub fn with_version(&mut self, version: MessageVersion) {
61 self.version = version;
62 }
63
64 #[inline]
65 pub fn version(&self) -> MessageVersion {
66 self.version
67 }
68
69 #[inline]
70 pub fn topic(&self) -> &CheetahString {
71 self.message_ext_inner.topic()
72 }
73
74 #[inline]
75 pub fn get_topic(&self) -> &CheetahString {
76 self.message_ext_inner.topic()
77 }
78
79 #[inline]
80 pub fn born_host(&self) -> SocketAddr {
81 self.message_ext_inner.born_host()
82 }
83
84 #[inline]
85 pub fn store_host(&self) -> SocketAddr {
86 self.message_ext_inner.store_host()
87 }
88
89 #[inline]
90 pub fn with_born_host_v6_flag(&mut self) {
91 self.message_ext_inner.with_born_host_v6_flag()
92 }
93
94 #[inline]
95 pub fn with_store_host_v6_flag(&mut self) {
96 self.message_ext_inner.with_store_host_v6_flag()
97 }
98
99 #[inline]
100 pub fn body(&self) -> Option<bytes::Bytes> {
101 self.message_ext_inner.body()
102 }
103
104 #[inline]
105 pub fn sys_flag(&self) -> i32 {
106 self.message_ext_inner.sys_flag()
107 }
108
109 #[inline]
110 pub fn body_crc(&self) -> u32 {
111 self.message_ext_inner.body_crc()
112 }
113
114 #[inline]
115 pub fn queue_id(&self) -> i32 {
116 self.message_ext_inner.queue_id()
117 }
118
119 #[inline]
120 pub fn flag(&self) -> i32 {
121 self.message_ext_inner.flag()
122 }
123
124 #[inline]
125 pub fn born_timestamp(&self) -> i64 {
126 self.message_ext_inner.born_timestamp()
127 }
128
129 #[inline]
130 pub fn store_timestamp(&self) -> i64 {
131 self.message_ext_inner.store_timestamp()
132 }
133
134 #[inline]
135 pub fn born_host_bytes(&self) -> bytes::Bytes {
136 self.message_ext_inner.born_host_bytes()
137 }
138
139 #[inline]
140 pub fn store_host_bytes(&self) -> bytes::Bytes {
141 self.message_ext_inner.born_store_bytes()
142 }
143
144 #[inline]
145 pub fn reconsume_times(&self) -> i32 {
146 self.message_ext_inner.reconsume_times()
147 }
148
149 #[inline]
150 pub fn prepared_transaction_offset(&self) -> i64 {
151 self.message_ext_inner.prepared_transaction_offset()
152 }
153
154 #[inline]
155 pub fn property(&self, name: &str) -> Option<CheetahString> {
156 self.message_ext_inner.properties().get(name).cloned()
157 }
158
159 #[inline]
160 pub fn properties_string(&self) -> &str {
161 self.properties_string.as_str()
162 }
163
164 #[inline]
165 pub fn queue_offset(&self) -> i64 {
166 self.message_ext_inner.queue_offset()
167 }
168
169 #[inline]
170 pub fn tags_string2tags_code(_filter: &TopicFilterType, tags: &str) -> i64 {
171 if tags.is_empty() {
172 return 0;
173 }
174 JavaStringHasher::hash_str(tags) as i64
175 }
176
177 #[inline]
178 pub fn tags_string_to_tags_code(tags: &str) -> i64 {
179 if tags.is_empty() {
180 return 0;
181 }
182 JavaStringHasher::hash_str(tags) as i64
183 }
184
185 #[inline]
186 pub fn get_tags(&self) -> Option<CheetahString> {
187 self.message_ext_inner.get_tags()
188 }
189
190 #[inline]
191 pub fn get_transaction_id(&self) -> Option<&CheetahString> {
192 self.message_ext_inner.get_transaction_id()
193 }
194
195 #[inline]
196 pub fn is_wait_store_msg_ok(&self) -> bool {
197 self.message_ext_inner.message.is_wait_store_msg_ok()
198 }
199
200 #[inline]
201 pub fn body_len(&self) -> usize {
202 self.message_ext_inner.message.body_slice().len()
203 }
204}
205
206impl fmt::Display for MessageExtBrokerInner {
207 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
208 let encoded_buff_str = match &self.encoded_buff {
209 Some(encoded_buff) =>
210 {
212 "****".to_string()
213 }
214 None => "None".to_string(),
215 };
216
217 write!(
218 f,
219 "MessageExtBrokerInner {{ message_ext_inner: {}, properties_string: {}, tags_code: {}, encoded_buff: {}, \
220 encode_completed: {}, version: {} }}",
221 self.message_ext_inner,
222 self.properties_string,
223 self.tags_code,
224 encoded_buff_str,
225 self.encode_completed,
226 self.version
227 )
228 }
229}
230
231impl Debug for MessageExtBrokerInner {
232 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
233 let encoded_buff_str = match &self.encoded_buff {
234 Some(encoded_buff) =>
235 {
237 "****".to_string()
238 }
239 None => "None".to_string(),
240 };
241
242 write!(
243 f,
244 "MessageExtBrokerInner {{ message_ext_inner: {:?}, properties_string: {}, tags_code: {}, encoded_buff: \
245 {}, encode_completed: {}, version: {} }}",
246 self.message_ext_inner,
247 self.properties_string,
248 self.tags_code,
249 encoded_buff_str,
250 self.encode_completed,
251 self.version
252 )
253 }
254}
255
256impl MessageTrait for MessageExtBrokerInner {
257 #[inline]
258 fn put_property(&mut self, key: CheetahString, value: CheetahString) {
259 self.message_ext_inner.put_property(key, value);
260 self.properties_string = message_properties_to_string(self.message_ext_inner.get_properties());
261 }
262
263 #[inline]
264 fn clear_property(&mut self, name: &str) {
265 self.delete_property(name);
266 }
267
268 #[inline]
269 fn property(&self, name: &CheetahString) -> Option<CheetahString> {
270 self.message_ext_inner.property(name)
271 }
272
273 fn property_ref(&self, name: &CheetahString) -> Option<&CheetahString> {
274 self.message_ext_inner.property_ref(name)
275 }
276
277 #[inline]
278 fn topic(&self) -> &CheetahString {
279 self.message_ext_inner.topic()
280 }
281
282 #[inline]
283 fn set_topic(&mut self, topic: CheetahString) {
284 self.message_ext_inner.set_topic(topic);
285 }
286
287 #[inline]
288 fn get_flag(&self) -> i32 {
289 self.message_ext_inner.get_flag()
290 }
291
292 #[inline]
293 fn set_flag(&mut self, flag: i32) {
294 self.message_ext_inner.set_flag(flag);
295 }
296
297 #[inline]
298 fn get_body(&self) -> Option<&Bytes> {
299 self.message_ext_inner.get_body()
300 }
301
302 #[inline]
303 fn set_body(&mut self, body: Bytes) {
304 self.message_ext_inner.set_body(body);
305 }
306
307 #[inline]
308 fn get_properties(&self) -> &HashMap<CheetahString, CheetahString> {
309 self.message_ext_inner.get_properties()
310 }
311
312 #[inline]
313 fn set_properties(&mut self, properties: HashMap<CheetahString, CheetahString>) {
314 self.message_ext_inner.set_properties(properties.clone());
315 self.properties_string = message_properties_to_string(&properties);
316 }
317
318 #[inline]
319 fn transaction_id(&self) -> Option<&CheetahString> {
320 self.message_ext_inner.transaction_id()
321 }
322
323 #[inline]
324 fn set_transaction_id(&mut self, transaction_id: CheetahString) {
325 self.message_ext_inner.set_transaction_id(transaction_id);
326 }
327
328 #[inline]
329 fn get_compressed_body_mut(&mut self) -> Option<&mut Bytes> {
330 self.message_ext_inner.get_compressed_body_mut()
331 }
332
333 #[inline]
334 fn get_compressed_body(&self) -> Option<&Bytes> {
335 self.message_ext_inner.get_compressed_body()
336 }
337
338 #[inline]
339 fn set_compressed_body_mut(&mut self, compressed_body: Bytes) {
340 self.message_ext_inner.set_compressed_body_mut(compressed_body);
341 }
342
343 #[inline]
344 fn take_body(&mut self) -> Option<Bytes> {
345 self.message_ext_inner.take_body()
346 }
347
348 #[inline]
349 fn as_any(&self) -> &dyn Any {
350 self
351 }
352
353 #[inline]
354 fn as_any_mut(&mut self) -> &mut dyn Any {
355 self
356 }
357}
358
359impl From<MessageExtBrokerInner> for crate::common::message::broker_message::BrokerMessage {
361 fn from(inner: MessageExtBrokerInner) -> Self {
362 use crate::common::message::broker_message::BrokerMessage;
363 use crate::common::message::message_envelope::MessageEnvelope;
364
365 let envelope = MessageEnvelope::from(inner.message_ext_inner);
366
367 BrokerMessage::new(envelope, inner.tags_code, inner.properties_string, inner.version)
368 }
369}
370
371impl From<crate::common::message::broker_message::BrokerMessage> for MessageExtBrokerInner {
373 fn from(broker_msg: crate::common::message::broker_message::BrokerMessage) -> Self {
374 use crate::common::message::message_ext::MessageExt;
375
376 let message_ext_inner = MessageExt::from(broker_msg.envelope().clone());
377
378 Self {
379 message_ext_inner,
380 properties_string: CheetahString::from_string(broker_msg.properties_string().to_string()),
381 tags_code: broker_msg.tags_code(),
382 encoded_buff: broker_msg.encoded_buff().cloned(),
383 encode_completed: broker_msg.is_encode_completed(),
384 version: broker_msg.version(),
385 }
386 }
387}
388
389#[cfg(test)]
390mod tests {
391 use std::collections::HashMap;
392
393 use super::MessageExtBrokerInner;
394 use crate::common::message::message_decoder::string_to_message_properties;
395 use crate::common::message::MessageTrait;
396 use cheetah_string::CheetahString;
397
398 #[test]
399 fn message_ext_broker_inner_get_transaction_id_delegates_to_inner_message() {
400 let mut message = MessageExtBrokerInner::default();
401 MessageTrait::set_transaction_id(&mut message, CheetahString::from("tx-123"));
402
403 assert_eq!(message.get_transaction_id(), Some(&CheetahString::from("tx-123")));
404 }
405
406 #[test]
407 fn message_ext_broker_inner_put_property_updates_properties_string() {
408 let mut message = MessageExtBrokerInner::default();
409
410 message.put_property(CheetahString::from("k"), CheetahString::from("v"));
411
412 let decoded = string_to_message_properties(Some(&CheetahString::from(message.properties_string())));
413 assert_eq!(decoded.get("k").map(CheetahString::as_str), Some("v"));
414 }
415
416 #[test]
417 fn message_ext_broker_inner_set_properties_updates_properties_string() {
418 let mut message = MessageExtBrokerInner::default();
419 let properties = HashMap::from([(CheetahString::from("k"), CheetahString::from("v"))]);
420
421 message.set_properties(properties);
422
423 let decoded = string_to_message_properties(Some(&CheetahString::from(message.properties_string())));
424 assert_eq!(decoded.get("k").map(CheetahString::as_str), Some("v"));
425 }
426
427 #[test]
428 fn message_ext_broker_inner_body_len_returns_zero_for_empty_body() {
429 let message = MessageExtBrokerInner::default();
430
431 assert_eq!(message.body_len(), 0);
432 }
433}