У меня есть требование отправлять уведомление из базы данных SQL пользователю, поскольку сервер отправлял события в Spring Boot.Я использовал SseEmitter для реализации этого.
1) @GetMapping(value = "/v2/user/notifications/event",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public ResponseEntity<SseEmitter> sendNotification(@RequestHeader(value = "Authorization") final String token) {
HttpHeaders headers = new HttpHeaders();
headers.add("Connection","keep-alive");
headers.add("Cache-Control", "no-cache");
List<HttpStatus> httpStatuses = new ArrayList<>();
httpStatuses.add(0, HttpStatus.OK);
SseEmitter sseEmitter = new SseEmitter(Long.MAX_VALUE);
Integer nextEventFireTime = appConfig.getConfiguration().getInteger("sse.nextEventFireTime");
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(Constants.MAX_THREAD_POOL_SSE);
scheduledExecutorService.scheduleAtFixedRate(() -> {
try {
service.sendNotification(sseEmitter, token);
} catch (BaseException e) {
httpStatuses.add(0, HttpStatus.INTERNAL_SERVER_ERROR);
sseEmitter.completeWithError(e);
scheduledExecutorService.shutdown();
}
} , 0, nextEventFireTime, TimeUnit.SECONDS);
return new ResponseEntity<>(sseEmitter, headers, httpStatuses.get(0));
}
* nextEventFireTime настроен как 15
2)@Override
public synchronized void sendNotification(SseEmitter emitter, String token) throws BaseException {
NotificationMetadata notificationMetadata =
getUnreadNotificationCount(token);
List<Notification2> notificationList;
notificationList =
getSseNotifications(token);
SseEmitter.SseEventBuilder event = SseEmitter.event();
NotificationResponse2 notificationResponse2 = new NotificationResponse2();
notificationResponse2.setData(notificationList);
notificationResponse2.setMetadata(notificationMetadata);
event.name(Constants.SSE_EVENT_NAME).data(notificationResponse2)
.build();
try {
emitter.send(event.reconnectTime(15000L));
} catch (Exception e) {
throw new BaseException("Failed to send notification event.. "+e.getMessage(), Constants.ERROR_CODE_INTERNAL_ERROR,
"sendNotification", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
Клиент ожидает ответа, и это занимает около 17 минут, когда естьнет данных в дБ для уведомления, но запрос подсчета извлекает данные, и когда есть данные, то также требуется 4-5 минут, чтобы дать ответ.
Я использую SseEmitter в первый раз и когда я отлаживаю кодна сервере выполняется, но ответ еще не получен.
Может кто-нибудь помочь мне с этой проблемой?