Сервер отправляет события, используя sseemitter, требуя больше времени для ответа - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть требование отправлять уведомление из базы данных 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 в первый раз и когда я отлаживаю кодна сервере выполняется, но ответ еще не получен.

Может кто-нибудь помочь мне с этой проблемой?

...