1
+ package com .redis .cluster .controller ;
2
+
3
+ import com .redis .cluster .pubsub .RedisPublisher ;
4
+ import com .redis .cluster .pubsub .RedisSubscriber ;
5
+ import com .redis .cluster .pubsub .RoomMessage ;
6
+ import lombok .RequiredArgsConstructor ;
7
+ import org .springframework .data .redis .listener .ChannelTopic ;
8
+ import org .springframework .data .redis .listener .RedisMessageListenerContainer ;
9
+ import org .springframework .web .bind .annotation .*;
10
+
11
+ import javax .annotation .PostConstruct ;
12
+ import java .util .HashMap ;
13
+ import java .util .Map ;
14
+ import java .util .Set ;
15
+
16
+ @ RequiredArgsConstructor
17
+ @ RequestMapping ("/pubsub" )
18
+ @ RestController
19
+ public class PubSubController {
20
+ // topic에 발행되는 액션을 처리할 Listner
21
+ private final RedisMessageListenerContainer redisMessageListener ;
22
+ // 발행자
23
+ private final RedisPublisher redisPublisher ;
24
+ // 구독자
25
+ private final RedisSubscriber redisSubscriber ;
26
+ // 특정 topic에 메시지를 발송할 수 있도록 topic정보를 Map에 저장
27
+ private Map <String , ChannelTopic > channels ;
28
+
29
+ @ PostConstruct
30
+ public void init () {
31
+ // 실행될때 topic정보를 담을 Map을 초기화
32
+ channels = new HashMap <>();
33
+ }
34
+
35
+ // 유효한 Topic 리스트 반환
36
+ @ GetMapping ("/room" )
37
+ public Set <String > findAllRoom () {
38
+ return channels .keySet ();
39
+ }
40
+
41
+ // Topic 생성하여 Listener에 등록후 Topic Map에 저장
42
+ @ PutMapping ("/room/{roomId}" )
43
+ public void createRoom (@ PathVariable String roomId ) {
44
+ ChannelTopic channel = new ChannelTopic (roomId );
45
+ redisMessageListener .addMessageListener (redisSubscriber , channel );
46
+ channels .put (roomId , channel );
47
+ }
48
+
49
+ // 특정 Topic에 메시지 발송
50
+ @ PostMapping ("/room/{roomId}" )
51
+ public void pushMessage (@ PathVariable String roomId , @ RequestParam String name , @ RequestParam String message ) {
52
+ ChannelTopic channel = channels .get (roomId );
53
+ redisPublisher .publish (channel , RoomMessage .builder ().name (name ).roomId (roomId ).message (message ).build ());
54
+ }
55
+
56
+ // 특정 Topic 삭제 후 Listener 해제
57
+ @ DeleteMapping ("/room/{roomId}" )
58
+ public void deleteRoom (@ PathVariable String roomId ) {
59
+ ChannelTopic channel = channels .get (roomId );
60
+ redisMessageListener .removeMessageListener (redisSubscriber , channel );
61
+ channels .remove (roomId );
62
+ }
63
+ }
0 commit comments