@@ -20,6 +20,7 @@ use bytes::Bytes;
2020use rocketmq_common:: common:: compression:: compressor_factory:: CompressorFactory ;
2121use rocketmq_common:: common:: message:: message_ext:: MessageExt ;
2222use rocketmq_common:: common:: message:: MessageConst ;
23+ use rocketmq_common:: common:: message:: MessageTrait ;
2324use rocketmq_common:: common:: sys_flag:: message_sys_flag:: MessageSysFlag ;
2425use rocketmq_common:: MessageAccessor :: MessageAccessor ;
2526use rocketmq_common:: MessageDecoder ;
@@ -28,8 +29,10 @@ use rocketmq_common::WeakCellWrapper;
2829use rocketmq_remoting:: code:: request_code:: RequestCode ;
2930use rocketmq_remoting:: code:: response_code:: ResponseCode ;
3031use rocketmq_remoting:: net:: channel:: Channel ;
32+ use rocketmq_remoting:: protocol:: header:: check_transaction_state_request_header:: CheckTransactionStateRequestHeader ;
3133use rocketmq_remoting:: protocol:: header:: notify_consumer_ids_changed_request_header:: NotifyConsumerIdsChangedRequestHeader ;
3234use rocketmq_remoting:: protocol:: header:: reply_message_request_header:: ReplyMessageRequestHeader ;
35+ use rocketmq_remoting:: protocol:: namespace_util:: NamespaceUtil ;
3336use rocketmq_remoting:: protocol:: remoting_command:: RemotingCommand ;
3437use rocketmq_remoting:: runtime:: connection_handler_context:: ConnectionHandlerContext ;
3538use rocketmq_remoting:: runtime:: processor:: RequestProcessor ;
@@ -62,10 +65,26 @@ impl RequestProcessor for ClientRemotingProcessor {
6265 let request_code = RequestCode :: from ( request. code ( ) ) ;
6366 info ! ( "process_request: {:?}" , request_code) ;
6467 match request_code {
68+ RequestCode :: CheckTransactionState => {
69+ self . check_transaction_state ( channel, ctx, request) . await
70+ }
71+ RequestCode :: ResetConsumerClientOffset => {
72+ unimplemented ! ( "ResetConsumerClientOffset" )
73+ }
74+ RequestCode :: GetConsumerStatusFromClient => {
75+ unimplemented ! ( "GetConsumerStatusFromClient" )
76+ }
77+ RequestCode :: GetConsumerRunningInfo => {
78+ unimplemented ! ( "GetConsumerRunningInfo" )
79+ }
80+ RequestCode :: ConsumeMessageDirectly => {
81+ unimplemented ! ( "ConsumeMessageDirectly" )
82+ }
6583 RequestCode :: PushReplyMessageToClient => self . receive_reply_message ( ctx, request) . await ,
6684 RequestCode :: NotifyConsumerIdsChanged => {
6785 self . notify_consumer_ids_changed ( channel, ctx, request)
6886 }
87+
6988 _ => {
7089 info ! ( "Unknown request code: {:?}" , request_code) ;
7190 Ok ( None )
@@ -190,4 +209,64 @@ impl ClientRemotingProcessor {
190209 }
191210 Ok ( None )
192211 }
212+
213+ async fn check_transaction_state (
214+ & mut self ,
215+ channel : Channel ,
216+ ctx : ConnectionHandlerContext ,
217+ mut request : RemotingCommand ,
218+ ) -> Result < Option < RemotingCommand > > {
219+ let request_header = request
220+ . decode_command_custom_header :: < CheckTransactionStateRequestHeader > ( )
221+ . unwrap ( ) ;
222+ let message_ext = MessageDecoder :: decode (
223+ request. get_body_mut ( ) . unwrap ( ) ,
224+ true ,
225+ true ,
226+ false ,
227+ false ,
228+ false ,
229+ ) ;
230+ if let Some ( mut message_ext) = message_ext {
231+ if let Some ( mut client_instance) = self . client_instance . upgrade ( ) {
232+ if let Some ( ref namespace) = client_instance. client_config . get_namespace ( ) {
233+ let topic = NamespaceUtil :: without_namespace_with_namespace (
234+ message_ext. get_topic ( ) ,
235+ client_instance
236+ . client_config
237+ . get_namespace ( )
238+ . unwrap_or_default ( )
239+ . as_str ( ) ,
240+ ) ;
241+ message_ext. set_topic ( topic. as_str ( ) ) ;
242+ }
243+ let transaction_id =
244+ message_ext. get_property ( MessageConst :: PROPERTY_UNIQ_CLIENT_MESSAGE_ID_KEYIDX ) ;
245+ if let Some ( transaction_id) = transaction_id {
246+ if !transaction_id. is_empty ( ) {
247+ message_ext. set_transaction_id ( transaction_id. as_str ( ) ) ;
248+ }
249+ }
250+ let group = message_ext. get_property ( MessageConst :: PROPERTY_PRODUCER_GROUP ) ;
251+ if let Some ( group) = group {
252+ let producer = client_instance. select_producer ( & group) . await ;
253+ if let Some ( producer) = producer {
254+ let addr = channel. remote_address ( ) . to_string ( ) ;
255+ producer. check_transaction_state (
256+ addr. as_str ( ) ,
257+ message_ext,
258+ request_header,
259+ ) ;
260+ } else {
261+ warn ! ( "checkTransactionState, pick producer group failed" ) ;
262+ }
263+ } else {
264+ warn ! ( "checkTransactionState, pick producer group failed" ) ;
265+ }
266+ }
267+ } else {
268+ warn ! ( "checkTransactionState, decode message failed" ) ;
269+ } ;
270+ Ok ( None )
271+ }
193272}
0 commit comments