PriorityBlockingQueue в Spring Boot зависает с более чем 9 одновременными запросами - PullRequest
0 голосов
/ 16 января 2019

Я обнаружил странное поведение в своем веб-приложении Spring Boot, когда запускаю более 9 одновременных запросов (например, с помощью Apache Bench).PriorityBlockingQueue зависает и не обрабатывает запрос:

Контроллер

@RequestMapping("/queueTest")
    public DeferredResult<List<Card> testQueue(@RequestParams ....)
    {
    --omitted code
        DeferredResult<List<Card>> result= new DeferredResult<List<Card>();
        queueService.put(result)) ;
    }

QueueService

public void put(DeferredResult<List<Card>> result) throws InterruptedException{

            requestId++;
           // log.info("RequestID{}",requestId);
            --omitted code
            RequestQueue request= new RequestQueue(requestId, param1, param2, etc)
            queue.put(request);
            }
        }

     public RequestQueue take() throws InterruptedException {
            RequestQueue request = queue.take();
        return queue
        }

QueueExecute / Consumer:

@Component
public class QueueExecute {

    @Autowired
    QueueService queueRequest;

    @Autowired
    CardService cardService;

    @PostConstruct
    public void init(){
        new Thread(this::execute).start();
    }

    private void execute()  {
        while (true){
            RequestQueue req;
            try {
                req = queueRequest.take();

            if(req != null) {

                List<Card> cards = cardService.process(params....)
                req.getCartones().setResult((ArrayList<Card>) cards);

            }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

ИтакЯ помещаю запрос в очередь и вынимаю его, вызывая транзакционный метод CardService для получения результатов.Это работает нормально до 9 одновременных запросов, после чего просто останавливается, когда очередь зависает.В чем причина этого?Я думаю, что PriorityBlockingQueue не имеет ограничений, поэтому запросы должны помещаться в очередь и ждать обработки, верно?

ОБНОВЛЕНО:

Похоже, проблема не в очереди, проблема в методе.Когда я вызываю API> 9, чем запросы, он зависает.Любая помощь?Спасибо, очень ценю любую помощь.

...