15
15
*/
16
16
package com .alibaba .rocketmq .broker .processor ;
17
17
18
+ import io .netty .channel .Channel ;
19
+ import io .netty .channel .ChannelHandlerContext ;
20
+
21
+ import java .io .UnsupportedEncodingException ;
22
+ import java .net .InetSocketAddress ;
23
+ import java .net .SocketAddress ;
24
+ import java .util .HashMap ;
25
+ import java .util .HashSet ;
26
+ import java .util .Iterator ;
27
+ import java .util .List ;
28
+ import java .util .Map ;
29
+ import java .util .Properties ;
30
+ import java .util .Set ;
31
+
32
+ import org .slf4j .Logger ;
33
+ import org .slf4j .LoggerFactory ;
34
+
18
35
import com .alibaba .rocketmq .broker .BrokerController ;
19
36
import com .alibaba .rocketmq .broker .client .ClientChannelInfo ;
20
37
import com .alibaba .rocketmq .broker .client .ConsumerGroupInfo ;
31
48
import com .alibaba .rocketmq .common .message .MessageQueue ;
32
49
import com .alibaba .rocketmq .common .protocol .RequestCode ;
33
50
import com .alibaba .rocketmq .common .protocol .ResponseCode ;
34
- import com .alibaba .rocketmq .common .protocol .body .*;
35
- import com .alibaba .rocketmq .common .protocol .header .*;
51
+ import com .alibaba .rocketmq .common .protocol .body .Connection ;
52
+ import com .alibaba .rocketmq .common .protocol .body .ConsumerConnection ;
53
+ import com .alibaba .rocketmq .common .protocol .body .GroupList ;
54
+ import com .alibaba .rocketmq .common .protocol .body .KVTable ;
55
+ import com .alibaba .rocketmq .common .protocol .body .LockBatchRequestBody ;
56
+ import com .alibaba .rocketmq .common .protocol .body .LockBatchResponseBody ;
57
+ import com .alibaba .rocketmq .common .protocol .body .ProducerConnection ;
58
+ import com .alibaba .rocketmq .common .protocol .body .QueryConsumeTimeSpanBody ;
59
+ import com .alibaba .rocketmq .common .protocol .body .QueueTimeSpan ;
60
+ import com .alibaba .rocketmq .common .protocol .body .TopicList ;
61
+ import com .alibaba .rocketmq .common .protocol .body .UnlockBatchRequestBody ;
62
+ import com .alibaba .rocketmq .common .protocol .header .ConsumeMessageDirectlyResultRequestHeader ;
63
+ import com .alibaba .rocketmq .common .protocol .header .CreateTopicRequestHeader ;
64
+ import com .alibaba .rocketmq .common .protocol .header .DeleteSubscriptionGroupRequestHeader ;
65
+ import com .alibaba .rocketmq .common .protocol .header .DeleteTopicRequestHeader ;
66
+ import com .alibaba .rocketmq .common .protocol .header .GetAllTopicConfigResponseHeader ;
67
+ import com .alibaba .rocketmq .common .protocol .header .GetBrokerConfigResponseHeader ;
68
+ import com .alibaba .rocketmq .common .protocol .header .GetConsumeStatsRequestHeader ;
69
+ import com .alibaba .rocketmq .common .protocol .header .GetConsumerConnectionListRequestHeader ;
70
+ import com .alibaba .rocketmq .common .protocol .header .GetConsumerRunningInfoRequestHeader ;
71
+ import com .alibaba .rocketmq .common .protocol .header .GetConsumerStatusRequestHeader ;
72
+ import com .alibaba .rocketmq .common .protocol .header .GetEarliestMsgStoretimeRequestHeader ;
73
+ import com .alibaba .rocketmq .common .protocol .header .GetEarliestMsgStoretimeResponseHeader ;
74
+ import com .alibaba .rocketmq .common .protocol .header .GetMaxOffsetRequestHeader ;
75
+ import com .alibaba .rocketmq .common .protocol .header .GetMaxOffsetResponseHeader ;
76
+ import com .alibaba .rocketmq .common .protocol .header .GetMinOffsetRequestHeader ;
77
+ import com .alibaba .rocketmq .common .protocol .header .GetMinOffsetResponseHeader ;
78
+ import com .alibaba .rocketmq .common .protocol .header .GetProducerConnectionListRequestHeader ;
79
+ import com .alibaba .rocketmq .common .protocol .header .GetTopicStatsInfoRequestHeader ;
80
+ import com .alibaba .rocketmq .common .protocol .header .QueryConsumeTimeSpanRequestHeader ;
81
+ import com .alibaba .rocketmq .common .protocol .header .QueryConsumerOffsetRequestHeader ;
82
+ import com .alibaba .rocketmq .common .protocol .header .QueryConsumerOffsetResponseHeader ;
83
+ import com .alibaba .rocketmq .common .protocol .header .QueryTopicConsumeByWhoRequestHeader ;
84
+ import com .alibaba .rocketmq .common .protocol .header .ResetOffsetRequestHeader ;
85
+ import com .alibaba .rocketmq .common .protocol .header .SearchOffsetRequestHeader ;
86
+ import com .alibaba .rocketmq .common .protocol .header .SearchOffsetResponseHeader ;
87
+ import com .alibaba .rocketmq .common .protocol .header .UpdateConsumerOffsetRequestHeader ;
88
+ import com .alibaba .rocketmq .common .protocol .header .UpdateConsumerOffsetResponseHeader ;
36
89
import com .alibaba .rocketmq .common .protocol .header .filtersrv .RegisterFilterServerRequestHeader ;
37
90
import com .alibaba .rocketmq .common .protocol .header .filtersrv .RegisterFilterServerResponseHeader ;
38
91
import com .alibaba .rocketmq .common .protocol .heartbeat .SubscriptionData ;
43
96
import com .alibaba .rocketmq .remoting .protocol .RemotingCommand ;
44
97
import com .alibaba .rocketmq .remoting .protocol .RemotingSerializable ;
45
98
import com .alibaba .rocketmq .store .DefaultMessageStore ;
46
- import io .netty .channel .Channel ;
47
- import io .netty .channel .ChannelHandlerContext ;
48
- import org .slf4j .Logger ;
49
- import org .slf4j .LoggerFactory ;
50
-
51
- import java .io .UnsupportedEncodingException ;
52
- import java .net .InetSocketAddress ;
53
- import java .net .SocketAddress ;
54
- import java .util .*;
55
99
56
100
57
101
/**
@@ -173,6 +217,9 @@ public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand
173
217
174
218
case RequestCode .GET_CONSUMER_RUNNING_INFO :
175
219
return this .getConsumerRunningInfo (ctx , request );
220
+
221
+ case RequestCode .CONSUME_MESSAGE_DIRECTLY :
222
+ return this .consumeMessageDirectly (ctx , request );
176
223
default :
177
224
break ;
178
225
}
@@ -181,6 +228,49 @@ public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand
181
228
}
182
229
183
230
231
+ private RemotingCommand consumeMessageDirectly (ChannelHandlerContext ctx , RemotingCommand request )
232
+ throws RemotingCommandException {
233
+ final RemotingCommand response = RemotingCommand .createResponseCommand (null );
234
+ final ConsumeMessageDirectlyResultRequestHeader requestHeader =
235
+ (ConsumeMessageDirectlyResultRequestHeader ) request
236
+ .decodeCommandCustomHeader (ConsumeMessageDirectlyResultRequestHeader .class );
237
+
238
+ ClientChannelInfo clientChannelInfo =
239
+ this .brokerController .getConsumerManager ().findChannel (requestHeader .getConsumerGroup (),
240
+ requestHeader .getClientId ());
241
+
242
+ if (null == clientChannelInfo ) {
243
+ response .setCode (ResponseCode .SYSTEM_ERROR );
244
+ response .setRemark (String .format ("The Consumer <%s> not online" , requestHeader .getClientId ()));
245
+ return response ;
246
+ }
247
+
248
+ if (clientChannelInfo .getVersion () < MQVersion .Version .V3_1_8_SNAPSHOT .ordinal ()) {
249
+ response .setCode (ResponseCode .SYSTEM_ERROR );
250
+ response .setRemark (String .format (
251
+ "The Consumer <%s> Version <%s> too low to finish, please upgrade it to V3_1_8_SNAPSHOT" , //
252
+ requestHeader .getClientId (),//
253
+ MQVersion .getVersionDesc (clientChannelInfo .getVersion ())));
254
+ return response ;
255
+ }
256
+
257
+ try {
258
+ RemotingCommand newRequest =
259
+ RemotingCommand .createRequestCommand (RequestCode .CONSUME_MESSAGE_DIRECTLY , requestHeader );
260
+ RemotingCommand consumerResponse =
261
+ this .brokerController .getBroker2Client ().getConsumerRunningInfo (
262
+ clientChannelInfo .getChannel (), newRequest );
263
+ return consumerResponse ;
264
+ }
265
+ catch (Exception e ) {
266
+ response .setCode (ResponseCode .SYSTEM_ERROR );
267
+ response .setRemark (String .format ("invoke consumer <%s> Exception: %s" ,
268
+ requestHeader .getClientId (), RemotingHelper .exceptionSimpleDesc (e )));
269
+ return response ;
270
+ }
271
+ }
272
+
273
+
184
274
/**
185
275
* 调用Consumer,获取Consumer内存数据结构,为监控以及定位问题
186
276
*/
0 commit comments