Skip to content

Commit 695a4ba

Browse files
authored
Merge pull request #321 from let-s-record-it/feature-320
fix[#320]: 데이터 전송 실패 시 SseEmitter 삭제 및 완료 처리
2 parents 43eab2b + 6f292eb commit 695a4ba

6 files changed

Lines changed: 19 additions & 24 deletions

File tree

src/main/java/com/sillim/recordit/invite/service/InviteService.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import com.sillim.recordit.member.domain.Member;
1515
import com.sillim.recordit.pushalarm.dto.PushMessage;
1616
import com.sillim.recordit.pushalarm.service.AlarmService;
17-
import java.io.IOException;
1817
import java.time.LocalDateTime;
1918
import java.util.Base64;
2019
import java.util.Optional;
@@ -75,8 +74,7 @@ public InviteLink searchInviteInfo(String inviteCode) {
7574
new String(Base64.getUrlDecoder().decode(inviteCode)));
7675
}
7776

78-
public void inviteMember(Long calendarId, Long invitedMemberId, Member inviter)
79-
throws IOException {
77+
public void inviteMember(Long calendarId, Long invitedMemberId, Member inviter) {
8078
Calendar calendar = calendarQueryService.searchByCalendarId(calendarId);
8179
calendar.validateAuthenticatedMember(inviter.getId());
8280

src/main/java/com/sillim/recordit/member/service/MemberFollowService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import com.sillim.recordit.pushalarm.dto.PushMessage;
88
import com.sillim.recordit.pushalarm.service.AlarmService;
99
import jakarta.persistence.OptimisticLockException;
10-
import java.io.IOException;
1110
import lombok.RequiredArgsConstructor;
1211
import org.hibernate.StaleObjectStateException;
1312
import org.springframework.orm.ObjectOptimisticLockingFailureException;
@@ -33,7 +32,7 @@ public class MemberFollowService {
3332
},
3433
maxAttempts = 15,
3534
backoff = @Backoff(delay = 30))
36-
public void follow(Long followerId, Long followedId) throws IOException {
35+
public void follow(Long followerId, Long followedId) {
3736
Member follower = memberQueryService.findByMemberId(followerId);
3837
Member followed = memberQueryService.findByMemberId(followedId);
3938

src/main/java/com/sillim/recordit/pushalarm/job/ScheduleAlarmJob.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,8 @@
44
import com.google.firebase.messaging.FirebaseMessagingException;
55
import com.google.firebase.messaging.Message;
66
import com.google.firebase.messaging.Notification;
7-
import com.sillim.recordit.global.exception.ErrorCode;
8-
import com.sillim.recordit.global.exception.common.ApplicationException;
97
import com.sillim.recordit.pushalarm.dto.PushMessage;
108
import com.sillim.recordit.pushalarm.service.AlarmService;
11-
import java.io.IOException;
129
import java.util.List;
1310
import lombok.extern.slf4j.Slf4j;
1411
import org.quartz.Job;
@@ -50,11 +47,6 @@ public void execute(JobExecutionContext context) {
5047
}
5148
});
5249

53-
try {
54-
alarmService.pushAlarm(
55-
-1L, memberId, PushMessage.fromSchedule(scheduleId, title, body));
56-
} catch (IOException e) {
57-
throw new ApplicationException(ErrorCode.UNHANDLED_EXCEPTION, e.getMessage());
58-
}
50+
alarmService.pushAlarm(-1L, memberId, PushMessage.fromSchedule(scheduleId, title, body));
5951
}
6052
}

src/main/java/com/sillim/recordit/pushalarm/service/AlarmService.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.sillim.recordit.pushalarm.domain.AlarmLog;
44
import com.sillim.recordit.pushalarm.dto.PushMessage;
55
import com.sillim.recordit.pushalarm.repository.AlarmLogRepository;
6-
import java.io.IOException;
76
import lombok.RequiredArgsConstructor;
87
import org.springframework.stereotype.Service;
98
import org.springframework.transaction.annotation.Transactional;
@@ -15,8 +14,7 @@ public class AlarmService {
1514
private final SseEmitterManager sseEmitterManager;
1615
private final AlarmLogRepository alarmLogRepository;
1716

18-
public boolean pushAlarm(Long senderId, Long receiverId, PushMessage message)
19-
throws IOException {
17+
public boolean pushAlarm(Long senderId, Long receiverId, PushMessage message) {
2018
AlarmLog alarmLog =
2119
alarmLogRepository.save(
2220
AlarmLog.builder()

src/main/java/com/sillim/recordit/pushalarm/service/SseEmitterManager.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@
1010
@Slf4j
1111
@Service
1212
public class SseEmitterManager {
13+
14+
private static final Long TIMEOUT = 60L * 60 * 1000;
15+
1316
private final ConcurrentHashMap<Long, SseEmitter> clients = new ConcurrentHashMap<>();
1417

1518
public SseEmitter subscribe(Long memberId) {
16-
SseEmitter emitter = new SseEmitter(Long.MAX_VALUE);
19+
SseEmitter emitter = new SseEmitter(TIMEOUT);
1720
clients.put(memberId, emitter);
1821

1922
emitter.onCompletion(() -> clients.remove(memberId));
@@ -24,12 +27,18 @@ public SseEmitter subscribe(Long memberId) {
2427
return emitter;
2528
}
2629

27-
public boolean sendToClient(Long memberId, PushMessage message) throws IOException {
30+
public boolean sendToClient(Long memberId, PushMessage message) {
2831
SseEmitter emitter = clients.get(memberId);
2932

3033
if (emitter != null) {
31-
emitter.send(SseEmitter.event().name(message.type().name()).data(message));
32-
return true;
34+
try {
35+
emitter.send(SseEmitter.event().name(message.type().name()).data(message));
36+
return true;
37+
} catch (IOException exception) {
38+
clients.remove(memberId);
39+
emitter.completeWithError(exception);
40+
return false;
41+
}
3342
}
3443
return false;
3544
}

src/test/java/com/sillim/recordit/pushalarm/service/SseEmitterManagerTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import com.sillim.recordit.pushalarm.dto.AlarmType;
66
import com.sillim.recordit.pushalarm.dto.PushMessage;
7-
import java.io.IOException;
87
import org.junit.jupiter.api.DisplayName;
98
import org.junit.jupiter.api.Test;
109

@@ -14,7 +13,7 @@ class SseEmitterManagerTest {
1413

1514
@Test
1615
@DisplayName("sseEmitter로 client에게 message를 보낼 수 있다.")
17-
void sendToClient() throws IOException {
16+
void sendToClient() {
1817
long memberId = 1L;
1918
sseEmitterManager.subscribe(memberId);
2019

@@ -27,7 +26,7 @@ void sendToClient() throws IOException {
2726

2827
@Test
2928
@DisplayName("subscribe한 client가 없으면 message를 보낼 수 없다.")
30-
void cantSendToClientIfNotExistsClientSubscribeSseEmitter() throws IOException {
29+
void cantSendToClientIfNotExistsClientSubscribeSseEmitter() {
3130
long memberId = 1L;
3231

3332
boolean result =

0 commit comments

Comments
 (0)