В течение нескольких дней искали решение. Публикация на случай, если кому-то это поможет.
Наша реализация ServletContextListener получала новый MemcachedClient (...) для contextInitialized и затем вызывала метод MemacachedClient shutdown () для contextDestroyed. Я всегда получал бы CancellationException или ExecutionException при первом запросе, который я отправлю. (Сообщения об ошибках упоминались обоими, но я смог уловить исключение ExecutionException.)
Решение: переключено с shutdown () на shutdown (1, TimeUnit.SECONDS)
Теперь вызов get успешно выполняется при первом запуске.
Я не могу точно объяснить, как вызов contextDestroyed мешал регулярной обработке запроса. Моя лучшая догадка заключается в том, что отдельный поток spymemcached каким-то образом распределяется между сервлетами, и поэтому, когда сервлет был создан для обработки запроса, отправленного на этапе проверки нашего процесса сборки, он был бы уничтожен до первого запроса Я отправил бы, и MemcachedClient, который использовал сервлет моего запроса, попытался бы использовать тот же поток и получить исключения из завершения работы.
(Наша команда установила необходимость вызова shutdown некоторое время назад, когда мы узнали, что у нашего веб-приложения слишком много открытых соединений с нашим сервером memcached.)