44import java .util .List ;
55import java .util .Map ;
66import java .util .Set ;
7+ import java .util .concurrent .atomic .AtomicInteger ;
78
89import org .springframework .beans .factory .annotation .Qualifier ;
910import org .springframework .context .annotation .Profile ;
@@ -56,7 +57,7 @@ private void processAdmissionForLesson(Long lessonId) {
5657 }
5758
5859 // 해당 레슨 대기열에서 인원 추출
59- Set <String > requestIds = waitingRoomService .dequeue (lessonId , ADMIT_BATCH_SIZE );
60+ List <String > requestIds = waitingRoomService .dequeue (lessonId , ADMIT_BATCH_SIZE );
6061
6162 if (requestIds .isEmpty ()) {
6263 return ;
@@ -68,22 +69,44 @@ private void processAdmissionForLesson(Long lessonId) {
6869 .toList ();
6970 List <String > statusInfos = mqRedisTemplate .opsForValue ().multiGet (statusKeys );
7071
71- if (statusInfos == null ) return ;
72+ if (statusInfos == null ) {
73+ log .warn (
74+ "Admission diagnostics. lessonId={}, dequeuedCount={}, statusKeyCount={}, statusInfos=null. Admission skipped after dequeue." ,
75+ lessonId , requestIds .size (), statusKeys .size ());
76+ return ;
77+ }
78+
79+ AtomicInteger statusNullCount = new AtomicInteger ();
80+ AtomicInteger invalidStatusCount = new AtomicInteger ();
81+ AtomicInteger xaddAttemptCount = new AtomicInteger ();
7282
7383 // Pipelining 방식으로 요청 상태 변경 / Stream ADD 로직 일괄 처리
7484 mqRedisTemplate .executePipelined (new SessionCallback <Object >() {
7585 @ Override
7686 public Object execute (RedisOperations operations ) {
7787 for (int i = 0 ; i < statusKeys .size (); i ++) {
7888 String info = statusInfos .get (i );
79- if (info == null ) continue ;
89+ if (info == null ) {
90+ statusNullCount .incrementAndGet ();
91+ continue ;
92+ }
8093
8194 String [] parts = info .split (":" );
82- if (parts .length < 3 ) continue ;
83-
84- String requestId = requestIds .toArray (new String [0 ])[i ];
85- Long userId = Long .parseLong (parts [2 ]);
86- Long originalTimestamp = parts .length >= 4 ? Long .parseLong (parts [3 ]) : System .currentTimeMillis ();
95+ if (parts .length < 3 ) {
96+ invalidStatusCount .incrementAndGet ();
97+ continue ;
98+ }
99+
100+ String requestId = requestIds .get (i );
101+ Long userId ;
102+ Long originalTimestamp ;
103+ try {
104+ userId = Long .parseLong (parts [2 ]);
105+ originalTimestamp = parts .length >= 4 ? Long .parseLong (parts [3 ]) : System .currentTimeMillis ();
106+ } catch (NumberFormatException e ) {
107+ invalidStatusCount .incrementAndGet ();
108+ continue ;
109+ }
87110
88111 // 상태 변경 (SET)
89112 String statusKey = statusKeys .get (i );
@@ -97,11 +120,16 @@ public Object execute(RedisOperations operations) {
97120 content .put ("requestId" , requestId );
98121 content .put ("timestamp" , String .valueOf (originalTimestamp ));
99122 operations .opsForStream ().add (LessonApplyStreamConstant .STREAM_KEY , content );
123+ xaddAttemptCount .incrementAndGet ();
100124 }
101125 return null ;
102126 }
103127 });
104128
129+ log .info (
130+ "Admission diagnostics. lessonId={}, dequeuedCount={}, statusKeyCount={}, statusNullCount={}, invalidStatusCount={}, xaddAttemptCount={}" ,
131+ lessonId , requestIds .size (), statusKeys .size (), statusNullCount .get (), invalidStatusCount .get (),
132+ xaddAttemptCount .get ());
105133 log .debug ("Admitted {} users to MQ via pipeline for lesson: {}" , requestIds .size (), lessonId );
106134 }
107135}
0 commit comments