Skip to main content

rocketmq_client_rust/
lib.rs

1// Copyright 2023 The RocketMQ Rust Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#![allow(dead_code)]
16#![allow(unused_variables)]
17#![allow(clippy::result_large_err)]
18#![recursion_limit = "256"]
19
20extern crate core;
21
22// Define macros at crate root so they're available throughout the crate
23/// Create a client error with optional response code
24#[macro_export]
25macro_rules! mq_client_err {
26    // Handle errors with a custom ResponseCode and formatted string
27    ($response_code:expr, $fmt:expr, $($arg:expr),*) => {{
28        let formatted_msg = format!($fmt, $($arg),*);
29        let error_message = format!("CODE: {}  DESC: {}", $response_code as i32, formatted_msg);
30        let faq_msg = rocketmq_common::common::FAQUrl::attach_default_url(Some(error_message.as_str()));
31        rocketmq_error::RocketMQError::illegal_argument(faq_msg)
32    }};
33
34    ($response_code:expr, $error_message:expr) => {{
35        let error_message = format!("CODE: {}  DESC: {}", $response_code as i32, $error_message);
36        let faq_msg = rocketmq_common::common::FAQUrl::attach_default_url(Some(error_message.as_str()));
37        rocketmq_error::RocketMQError::illegal_argument(faq_msg)
38    }};
39
40    // Handle errors without a ResponseCode, using only the error message (accepts both &str and String)
41    ($error_message:expr) => {{
42        let error_msg = format!("{}", $error_message);
43        let faq_msg = rocketmq_common::common::FAQUrl::attach_default_url(Some(error_msg.as_str()));
44        rocketmq_error::RocketMQError::illegal_argument(faq_msg)
45    }};
46}
47
48/// Create a broker operation error
49#[macro_export]
50macro_rules! client_broker_err {
51    // Handle errors with a custom ResponseCode and formatted string
52    ($response_code:expr, $error_message:expr, $broker_addr:expr) => {{
53        rocketmq_error::RocketMQError::broker_operation_failed(
54            "BROKER_OPERATION",
55            $response_code as i32,
56            $error_message,
57        )
58        .with_broker_addr($broker_addr)
59    }};
60    // Handle errors without a ResponseCode, using only the error message
61    ($response_code:expr, $error_message:expr) => {{
62        rocketmq_error::RocketMQError::broker_operation_failed(
63            "BROKER_OPERATION",
64            $response_code as i32,
65            $error_message,
66        )
67    }};
68}
69
70// Define client_error module
71pub mod client_error;
72
73pub mod admin;
74pub mod base;
75pub mod common;
76pub mod consumer;
77pub mod exception;
78pub mod factory;
79mod hook;
80pub mod implementation;
81pub mod latency;
82pub mod legacy;
83pub mod lock;
84pub mod producer;
85pub mod stat;
86mod trace;
87mod types;
88pub mod utils;
89
90pub use crate::admin::DefaultMQAdminExt;
91pub use crate::admin::DefaultMQAdminExtImpl;
92pub use crate::admin::MQAdminExt;
93pub use crate::admin::MQAdminExtInner;
94pub use crate::admin::MQAdminExtInnerImpl;
95pub use crate::base::MQAdmin;
96pub use crate::base::MqClientAdmin;
97pub use crate::base::MqClientAdminInner;
98pub use crate::common::acl::AclConstants;
99pub use crate::common::acl::AclException;
100pub use crate::common::acl::AclSigner;
101pub use crate::common::acl::AclUtils;
102pub use crate::common::acl::Permission;
103pub use crate::common::acl::SigningAlgorithm;
104pub use crate::common::acl_client_rpc_hook::AclClientRPCHook;
105pub use crate::common::admin_tool_result::AdminToolResult;
106pub use crate::common::admin_tools_result_code_enum::AdminToolsResultCodeEnum;
107pub use crate::common::nameserver_access_config::NameserverAccessConfig;
108pub use crate::common::session_credentials::SessionCredentials;
109pub use crate::consumer::consumer_impl::pull_request_ext::PullResultExt;
110pub use crate::consumer::notify_result::NotifyResult;
111pub use crate::consumer::AbstractAllocateMessageQueueStrategy;
112pub use crate::consumer::AckCallback;
113pub use crate::consumer::AckCallbackFn;
114pub use crate::consumer::AckResult;
115pub use crate::consumer::AckStatus;
116pub use crate::consumer::AllocateMachineRoomNearby;
117pub use crate::consumer::AllocateMessageQueueAveragely;
118pub use crate::consumer::AllocateMessageQueueAveragelyByCircle;
119pub use crate::consumer::AllocateMessageQueueByConfig;
120pub use crate::consumer::AllocateMessageQueueByMachineRoom;
121pub use crate::consumer::AllocateMessageQueueByMachineRoomNearby;
122pub use crate::consumer::AllocateMessageQueueConsistentHash;
123pub use crate::consumer::AllocateMessageQueueStrategy;
124pub use crate::consumer::ArcMessageQueueListener;
125pub use crate::consumer::ConsumeConcurrentlyContext;
126pub use crate::consumer::ConsumeConcurrentlyStatus;
127pub use crate::consumer::ConsumeOrderlyContext;
128pub use crate::consumer::ConsumeOrderlyStatus;
129pub use crate::consumer::ControllableOffset;
130pub use crate::consumer::DefaultLitePullConsumer;
131pub use crate::consumer::DefaultLitePullConsumerBuilder;
132pub use crate::consumer::DefaultMQPushConsumer;
133pub use crate::consumer::DefaultMQPushConsumerBuilder;
134pub use crate::consumer::HashFunction;
135pub use crate::consumer::LitePullConsumer;
136pub use crate::consumer::LocalFileOffsetStore;
137pub use crate::consumer::MQConsumer;
138pub use crate::consumer::MQConsumerInner;
139pub use crate::consumer::MQPushConsumer;
140pub use crate::consumer::MachineRoomResolver;
141pub use crate::consumer::MessageListener;
142pub use crate::consumer::MessageListenerConcurrently;
143pub use crate::consumer::MessageListenerOrderly;
144pub use crate::consumer::MessageQueueListener;
145pub use crate::consumer::MessageSelector;
146pub use crate::consumer::OffsetSerialize;
147pub use crate::consumer::OffsetSerializeWrapper;
148pub use crate::consumer::OffsetStore;
149pub use crate::consumer::PopCallback;
150pub use crate::consumer::PopCallbackFn;
151pub use crate::consumer::PopResult;
152pub use crate::consumer::PopStatus;
153pub use crate::consumer::PullCallback;
154pub use crate::consumer::PullCallbackFn;
155pub use crate::consumer::PullResult;
156pub use crate::consumer::PullStatus;
157pub use crate::consumer::ReadOffsetType;
158pub use crate::consumer::RemoteBrokerOffsetStore;
159pub use crate::consumer::TopicMessageQueueChangeListener;
160pub use crate::exception::MQBrokerException;
161pub use crate::exception::MQClientException;
162pub use crate::exception::OffsetNotFoundException;
163pub use crate::exception::RequestTimeoutException;
164pub use crate::hook::consume_message_context::ConsumeMessageContext;
165pub use crate::hook::consume_message_hook::ConsumeMessageHook;
166pub use crate::hook::consume_message_hook::ConsumeMessageHookArc;
167pub use crate::implementation::mq_client_api_factory::MQClientAPIFactory;
168pub type MQClientAPIExt = crate::implementation::mq_client_api_impl::MQClientAPIImpl;
169pub type MqClientAdminImpl = crate::implementation::mq_client_api_impl::MQClientAPIImpl;
170pub use crate::latency::BrokerFilter;
171pub use crate::latency::MQFaultStrategy;
172pub use crate::latency::Resolver;
173pub use crate::latency::ServiceDetector;
174#[allow(deprecated)]
175pub use crate::legacy::ConsumeMessageOpenTracingHookImpl;
176pub use crate::legacy::ConsumeRequest;
177#[allow(deprecated)]
178pub use crate::legacy::DefaultMQPullConsumer;
179#[allow(deprecated)]
180pub use crate::legacy::DefaultMQPullConsumerImpl;
181pub use crate::legacy::DoNothingClientRemotingProcessor;
182#[allow(deprecated)]
183pub use crate::legacy::EndTransactionOpenTracingHookImpl;
184#[allow(deprecated)]
185pub use crate::legacy::MQHelper;
186#[allow(deprecated)]
187pub use crate::legacy::MQPullConsumer;
188#[allow(deprecated)]
189pub use crate::legacy::MQPullConsumerScheduleService;
190#[allow(deprecated)]
191pub use crate::legacy::PullTaskCallback;
192#[allow(deprecated)]
193pub use crate::legacy::PullTaskContext;
194#[allow(deprecated)]
195pub use crate::legacy::PullTaskImpl;
196pub use crate::legacy::RebalanceImpl;
197#[allow(deprecated)]
198pub use crate::legacy::RebalancePullImpl;
199#[allow(deprecated)]
200pub use crate::legacy::SendMessageOpenTracingHookImpl;
201#[allow(deprecated)]
202pub use crate::legacy::TransactionCheckListener;
203pub use crate::lock::ReadWriteCASLock;
204pub use crate::producer::DefaultMQProducer;
205pub use crate::producer::JavaHashCode;
206pub use crate::producer::LocalTransactionState;
207pub use crate::producer::MQProducer;
208pub use crate::producer::MessageQueueSelector;
209pub use crate::producer::MessageQueueSelectorFn;
210pub use crate::producer::RequestCallback;
211pub use crate::producer::SelectMessageQueueByHash;
212pub use crate::producer::SelectMessageQueueByMachineRoom;
213pub use crate::producer::SelectMessageQueueByRandom;
214pub use crate::producer::SendCallback;
215pub use crate::producer::SendResult;
216pub use crate::producer::SendStatus;
217pub use crate::producer::TransactionListener;
218pub use crate::producer::TransactionMQProducer;
219pub use crate::producer::TransactionMQProducerBuilder;
220pub use crate::producer::TransactionSendResult;
221pub use crate::trace::async_trace_dispatcher::AsyncTraceDispatcher;
222pub use crate::trace::trace_data_encoder::TraceDataEncoder;
223pub use crate::trace::trace_dispatcher::ArcTraceDispatcher;
224pub use crate::trace::trace_dispatcher::TraceDispatcher;
225pub use crate::trace::trace_dispatcher::Type as TraceDispatcherOperation;
226pub use crate::trace::trace_dispatcher_type::TraceDispatcherType;
227pub use crate::trace::trace_type::TraceType;
228
229#[cfg(test)]
230mod tests {
231    #[test]
232    fn mq_client_err_without_response_code_preserves_message() {
233        let err = crate::mq_client_err!("simple client error");
234
235        match err {
236            rocketmq_error::RocketMQError::IllegalArgument(message) => {
237                assert!(message.contains("simple client error"));
238                assert!(!message.contains("Body is empty"));
239            }
240            other => panic!("expected illegal argument error, got {other:?}"),
241        }
242    }
243}