#java #sockets #servlets #embedded-jetty
#java #сокеты #сервлеты #встроенный-jetty
Вопрос:
Здесь я пытаюсь отклонить запрос на уровне сервера jetty, прежде чем перейти к сервлету. Поскольку, согласно приведенной ниже конфигурации, пул потоков имеет 6 минимальных и 10 максимальных потоков параллельного выполнения, и 10 запросов могут быть поставлены в очередь в пуле потоков, где на уровне соединителя может быть поставлено в очередь 55 запросов. таким образом, всего 85, что означает, что если одновременно отправляется 200 запросов, 115 запросов должны быть отклонены. Но даже если я отправлю 1000 запросов одновременно с помощью jmeter. Сервер Jetty обслуживает все запросы. Ниже приведен фрагмент кода.
Server server = new Server();
QueuedThreadPool threadPool = new QueuedThreadPool();
LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(15);
ExecutorThreadPool pool = new ExecutorThreadPool(6, 10, 30000, TimeUnit.MILLISECONDS, queue);
server.setThreadPool(pool);
threadPool.setMaxThreads(AssuranceConfiguration.annetAssurancesrvConsumerThread);
server.setThreadPool(threadPool);
if (AssuranceConfiguration.annetAssurancesrvSslRequired)
{
if (logger.isInfoEnabled())
{
logger.info("Going to use HTTPS, Initialising SSL context....");
}
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStore(JettyServer.class.getResource(KEYSTOREFILE).getFile());
sslContextFactory.setKeyStorePassword(AssuranceConfiguration.annetAssurancesrvKeystoreidentifier);
sslContextFactory.setKeyManagerPassword(AssuranceConfiguration.annetAssurancesrvKeystoremanagerPassword);
SslSelectChannelConnector sslConnector = new SslSelectChannelConnector(sslContextFactory);
sslConnector.setPort(AssuranceConfiguration.annetAssurancesrvPort);
server.setConnectors(new Connector[] { sslConnector });
}
else
{
if (logger.isInfoEnabled())
{
logger.info("Going to use HTTP, Initialising simple context....");
}
SelectChannelConnector simpleConnector = new SelectChannelConnector();
simpleConnector.setPort(AssuranceConfiguration.annetAssurancesrvPort);
simpleConnector.setMaxIdleTime(30000);
simpleConnector.setRequestHeaderSize(8192);
server.setConnectors(new Connector[] { simpleConnector });
simpleConnector.setAcceptQueueSize(55);
}
Комментарии:
1. Связь между входящим соединением и запросами не так проста, ваша конфигурация потока будет устанавливать только искусственное ограничение на количество запросов, но в соединении может быть 0 ..n запросов. В вашей конфигурации легко использовать все потоки только с 1 подключением.
2. спасибо за ответ . Но как одно соединение будет обслуживать несколько запросов. соединение является эксклюзивным между сервером и клиентом. после обработки запроса это конкретное соединение закрывается между сервером и клиентом.
3. Вы имеете в виду более старую спецификацию HTTP / 0.9, которая это делает. HTTP / 1.0 имеет функцию keep-alive как необязательную, а HTTP / 1.1 имеет постоянные / конвейерные соединения по умолчанию. Например, соединение HTTP / 1.1 может подключаться, отправлять 0 .. n запросов, затем оно ожидает ответов (обработка запросов / потоков может быть распараллелена, но запись ответа должна быть последовательной в соответствии со спецификацией)
4. И нет 1 потока на 1 правило обработки запросов с сервлетом 3.0 и выше. Вы можете легко иметь 1 поток, обрабатывающий несколько запросов на несколько подключений, если ваш сервлет использует функции Servlet 3.0 .
5. Еще раз спасибо за ценную информацию. Но для того, чтобы удовлетворить мое требование, какой может быть наилучший подход, по вашему мнению 🙂