3434import static com .rabbitmq .stream .Constants .COMMAND_ROUTE ;
3535import static com .rabbitmq .stream .Constants .COMMAND_SASL_AUTHENTICATE ;
3636import static com .rabbitmq .stream .Constants .COMMAND_SASL_HANDSHAKE ;
37+ import static com .rabbitmq .stream .Constants .COMMAND_STREAM_STATS ;
3738import static com .rabbitmq .stream .Constants .COMMAND_SUBSCRIBE ;
3839import static com .rabbitmq .stream .Constants .COMMAND_TUNE ;
3940import static com .rabbitmq .stream .Constants .COMMAND_UNSUBSCRIBE ;
6263import com .rabbitmq .stream .impl .Client .Response ;
6364import com .rabbitmq .stream .impl .Client .SaslAuthenticateResponse ;
6465import com .rabbitmq .stream .impl .Client .ShutdownContext .ShutdownReason ;
66+ import com .rabbitmq .stream .impl .Client .StreamInfoResponse ;
6567import com .rabbitmq .stream .impl .Client .StreamMetadata ;
6668import com .rabbitmq .stream .impl .Client .SubscriptionOffset ;
6769import com .rabbitmq .stream .metrics .MetricsCollector ;
@@ -132,6 +134,7 @@ class ServerFrameHandler {
132134 handlers .put (COMMAND_ROUTE , new RouteFrameHandler ());
133135 handlers .put (COMMAND_PARTITIONS , new PartitionsFrameHandler ());
134136 handlers .put (COMMAND_EXCHANGE_COMMAND_VERSIONS , new ExchangeCommandVersionsFrameHandler ());
137+ handlers .put (COMMAND_STREAM_STATS , new StreamStatsFrameHandler ());
135138 HANDLERS = new FrameHandler [maxCommandKey + 1 ][];
136139 handlers
137140 .entrySet ()
@@ -325,7 +328,7 @@ static int handleMessage(
325328 long offset ,
326329 long offsetLimit ,
327330 long chunkTimestamp ,
328- long committedOffset ,
331+ long committedChunkId ,
329332 Codec codec ,
330333 MessageListener messageListener ,
331334 byte subscriptionId ) {
@@ -339,7 +342,7 @@ static int handleMessage(
339342 messageFiltered .set (true );
340343 } else {
341344 Message message = codec .decode (data );
342- messageListener .handle (subscriptionId , offset , chunkTimestamp , committedOffset , message );
345+ messageListener .handle (subscriptionId , offset , chunkTimestamp , committedChunkId , message );
343346 }
344347 return read ;
345348 }
@@ -597,7 +600,7 @@ int doHandle(Client client, ChannelHandlerContext ctx, ByteBuf message) {
597600 client .chunkChecksum ,
598601 client .metricsCollector ,
599602 message .readByte (), // subscription ID
600- message .readLong (), // last committed offset , unsigned long
603+ message .readLong (), // committed chunk ID , unsigned long
601604 9 // byte read count, 1 + 9
602605 );
603606 }
@@ -1146,4 +1149,38 @@ int doHandle(Client client, ChannelHandlerContext ctx, ByteBuf message) {
11461149 return read ;
11471150 }
11481151 }
1152+
1153+ private static class StreamStatsFrameHandler extends BaseFrameHandler {
1154+
1155+ @ Override
1156+ int doHandle (Client client , ChannelHandlerContext ctx , ByteBuf message ) {
1157+ int correlationId = message .readInt ();
1158+ int read = 4 ;
1159+
1160+ short responseCode = message .readShort ();
1161+ read += 2 ;
1162+
1163+ int infoCount = message .readInt ();
1164+ read += 4 ;
1165+ Map <String , Long > info = new LinkedHashMap <>(infoCount );
1166+
1167+ for (int i = 0 ; i < infoCount ; i ++) {
1168+ String key = readString (message );
1169+ read += 2 + key .length ();
1170+ long value = message .readLong ();
1171+ info .put (key , value );
1172+ read += 8 ;
1173+ }
1174+
1175+ OutstandingRequest <StreamInfoResponse > outstandingRequest =
1176+ remove (client .outstandingRequests , correlationId , StreamInfoResponse .class );
1177+ if (outstandingRequest == null ) {
1178+ LOGGER .warn ("Could not find outstanding request with correlation ID {}" , correlationId );
1179+ } else {
1180+ outstandingRequest .response ().set (new StreamInfoResponse (responseCode , info ));
1181+ outstandingRequest .countDown ();
1182+ }
1183+ return read ;
1184+ }
1185+ }
11491186}
0 commit comments