микросервис jhipster с ошибкой sseemitter 406 - PullRequest
0 голосов
/ 23 октября 2018

Я сгенерировал приложение jhipster со шлюзом uaa и микросервисом.Теперь для запуска sse я добавил следующий контроллер

@RestController
@RequestMapping("/api")
public class AvgResultNftController {

    private final CopyOnWriteArrayList<SseEmitter> emitters = new CopyOnWriteArrayList<>();

    @GetMapping(path = "/avgResultNft")
    public SseEmitter getAvgResultNft() {
        SseEmitter emitter = new SseEmitter();
        this.emitters.add(emitter);

        emitter.onCompletion(() -> this.emitters.remove(emitter));
        emitter.onTimeout(() -> {
            emitter.complete();
            this.emitters.remove(emitter);
        });
        return emitter;
    }



    @SuppressWarnings("unlikely-arg-type")
    @EventListener
    public void onAvgResultNft(AvgResultNft avgResultNft) {
        List<SseEmitter> deadEmitters = new ArrayList<>();
        this.emitters.forEach(emitter -> {
            try {
                emitter.send(avgResultNft);
            } catch (Exception e) {
                deadEmitters.add(emitter);
            }
        });
        this.emitters.remove(deadEmitters);
    }

}

Я публикую AvgResultNft для какого-то события.

Я сгенерировал угловое приложение и назвал контроллер как

let source = new EventSource('http://192.168.1.5:8080/proxta/api/avgResultNft', {withCredentials: true })
source.addEventListener('message', message => {
      console.log(message)
    });

Я получаю 406 неприемлемую ошибку при вызове eventSource.Пожалуйста помоги.

1 Ответ

0 голосов
/ 13 февраля 2019

Я думаю, это поможет вам добавить headers = "Accept=*/*" и produces = MediaType.APPLICATION_OCTET_STREAM_VALUE или MediaType.APPLICATION_STREAM_JSON_VALUE

@GetMapping(value = "/avgResultNft", headers = "Accept=*/*",
            produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
    public SseEmitter getAvgResultNft() {
        SseEmitter emitter = new SseEmitter();
        this.emitters.add(emitter);

        emitter.onCompletion(() -> this.emitters.remove(emitter));
        emitter.onTimeout(() -> {
            emitter.complete();
            this.emitters.remove(emitter);
        });
        return emitter;
    }

Но будьте осторожны, zuul 1.х не поддерживает sse

Как заставить события, отправленные сервером (SSE), работать через Zuul Proxy spring-boot 2.1.1

...