복붙노트

[SPRING] Spring의 DeferredResult로 긴 폴링

SPRING

Spring의 DeferredResult로 긴 폴링

클라이언트는 비동기 메소드 (long polling)를 주기적으로 호출하여 서버가 데이터베이스를 쿼리하고 객체를 클라이언트에 반환하기 위해 사용하는 주식 기호 값을 전달합니다.

Spring의 DeferredResult 클래스를 사용하고 있지만, 어떻게 동작하는지 잘 알지 못합니다. 클라이언트에서 보낸 심볼 속성을 사용하여 데이터베이스에 새 데이터를 쿼리하는 방법에 유의하십시오 (아래 참조).

아마도 Spring에서의 긴 폴링을위한 더 나은 접근법이있을 것입니다.

어떻게 deferredResult () 메서드에서 symbol 속성을 processQueues ()로 전달합니까?

    private final Queue<DeferredResult<String>> responseBodyQueue = new ConcurrentLinkedQueue<>();

    @RequestMapping("/poll/{symbol}")
    public @ResponseBody DeferredResult<String> deferredResult(@PathVariable("symbol") String symbol) {
        DeferredResult<String> result = new DeferredResult<String>();
        this.responseBodyQueue.add(result);
        return result;
    }

    @Scheduled(fixedRate=2000)
    public void processQueues() {
        for (DeferredResult<String> result : this.responseBodyQueue) {
           Quote quote = jpaStockQuoteRepository.findStock(symbol);
            result.setResult(quote);
            this.responseBodyQueue.remove(result);
        }
    }

해결법

  1. ==============================

    1.Spring 4.1.7의 DeferredResult :

    Spring 4.1.7의 DeferredResult :

    DeferredResult를 확장하고 심볼 매개 변수를 클래스 필드로 저장할 수 있습니다.

    static class DeferredQuote extends DeferredResult<Quote> {
        private final String symbol;
        public DeferredQuote(String symbol) {
            this.symbol = symbol;
        }
    }
    
    @RequestMapping("/poll/{symbol}")
    public @ResponseBody DeferredQuote deferredResult(@PathVariable("symbol") String symbol) {
        DeferredQuote result = new DeferredQuote(symbol);
        responseBodyQueue.add(result);
        return result;
    }
    
    @Scheduled(fixedRate = 2000)
    public void processQueues() {
        for (DeferredQuote result : responseBodyQueue) {
            Quote quote = jpaStockQuoteRepository.findStock(result.symbol);
            result.setResult(quote);
            responseBodyQueue.remove(result);
        }
    }
    
  2. from https://stackoverflow.com/questions/31458910/long-polling-with-springs-deferredresult by cc-by-sa and MIT license