Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package likelion.mlb.backendProject.domain.chat.bus;


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
import java.util.UUID;
Expand All @@ -18,12 +19,16 @@ public class ChatRedisPublisher {
private final String nodeId = System.getProperty("node.id",
java.lang.management.ManagementFactory.getRuntimeMXBean().getName());

public void publishToRoom(String roomId, Map<String, Object> payload) {
try {
payload.put("_src", nodeId); // 루프 방지 태그
public void publishToRoom(String roomId, Map<String, Object> payload) throws JsonProcessingException {
System.out.println("roomId = "+roomId);
System.out.println("payload = "+payload);

//payload.put("_src", nodeId()); // 루프 방지 태그
String json = objectMapper.writeValueAsString(payload);
System.out.println("publishToRoom = "+json);

stringRedisTemplate.convertAndSend(roomId, json);
} catch (Exception ignore) {}

}

public String nodeId() { return nodeId; }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package likelion.mlb.backendProject.domain.chat.controller;


import com.fasterxml.jackson.core.JsonProcessingException;
import java.security.Principal;
import java.util.Map;
import java.util.UUID;
Expand Down Expand Up @@ -28,10 +29,9 @@ public class ChatMessagingController {


@Transactional
@MessageMapping("/chat/{roomId}/send")
public void send(@DestinationVariable UUID roomId,
ChatSendRequest req,
Principal principal) {
@MessageMapping("/chat/send")
public void send(ChatSendRequest req,
Principal principal) throws JsonProcessingException {

UUID userId = null;
if (principal instanceof Authentication auth
Expand All @@ -40,7 +40,7 @@ public void send(@DestinationVariable UUID roomId,
}

// ✅ 방 멤버인지 권한 체크 (아니면 바로 거절)
if (userId == null || !membershipRepository.isMember(roomId, userId)) {
if (userId == null || !membershipRepository.isMember(req.getRoomId(), userId)) {
throw new org.springframework.messaging.MessagingException("Not a member of this chat room");
// 또는 그냥 return; // 조용히 무시하고 싶으면
}
Expand All @@ -49,11 +49,11 @@ public void send(@DestinationVariable UUID roomId,
System.out.println("------------/chat/{roomId}/send 시작 ");

// 안전장치: 메시지의 roomId는 URL의 roomId로 강제
ChatMessage saved = chatMessageService.saveUserMessage(roomId, userId, req.getContent());
ChatMessage saved = chatMessageService.saveUserMessage(req.getRoomId(), userId, req.getContent());

Map<String, Object> payload = Map.of(
"id", saved.getId().toString(),
"chatRoomId", roomId.toString(),
"chatRoomId", req.getRoomId().toString(),
"type", saved.getMessageType().name(),
"content", saved.getContent(),
"userId", userId != null ? userId.toString() : null,
Expand All @@ -66,9 +66,9 @@ public void send(@DestinationVariable UUID roomId,
System.out.println("------------받은메세지"+req.getContent());

// ✅ 즉시 현재 노드의 클라이언트에게 전달
//messagingTemplate.convertAndSend("/topic/chat/" + roomId, payload);
messagingTemplate.convertAndSend("/topic/chat/" + req.getRoomId(), payload);

// ✅ 다른 노드를 위해 Redis로도 전달
chatRedisPublisher.publishToRoom("/topic/chat/" + roomId, new java.util.HashMap<>(payload));
chatRedisPublisher.publishToRoom("chat." + req.getRoomId(), payload);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnecti
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(new MessageListenerAdapter(redisSubscriber), new PatternTopic("draft.*"));
container.addMessageListener(new MessageListenerAdapter(redisSubscriber), new PatternTopic("chat/*"));
return container;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ public void onMessage(Message message, byte[] pattern) {
String msgBody = new String(message.getBody());
DraftRequest draftRequest = objectMapper.readValue(msgBody, DraftRequest.class);

simpMessagingTemplate.convertAndSend("/topic/draft." + draftRequest.getDraftId(), draftRequest);
// simpMessagingTemplate.convertAndSend("/topic/draft." + draftRequest.getDraftId(), draftRequest);
simpMessagingTemplate.convertAndSend("/chat/" + draftRequest.getDraftId(), draftRequest);
} catch (Exception e) {

}
Expand Down