Мы используем ThreadPoolTaskExecutor
в Spring (внутри Tomcat) для запуска параллельного сервера, который прослушивает порт (3001
).
Наш код выглядит примерно так:
....
ServerSocket listener = new ServerSocket(port);
Socket server;
while (true) {
PollingTask pollingTask;
server = listener.accept();
log.info ("Got a new connection, spawning a thread: " + i++);
taskExecutor.execute(new PollingTask(server, i));
}
И код PollingTask похож на:
....
PollingTask(Socket server, int counter) {
this.server = server;
this.counter = counter;
}
public void run() {
input = "";
try {
log.info ("New runnable thread: " + counter);
}
}
....
Конфигурация Spring выглядит следующим образом:
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="100" />
<property name="maxPoolSize" value="200" />
<property name="queueCapacity" value="50" />
<property name="keepAliveSeconds" value="600" />
</bean>
Этот конкретный компонент запускается при запуске, а затем мыпопробуйте подключиться к порту (3001
), используя telnet.
Интересно, что в наших журналах мы видим:
Got a new connection, spawning a thread: 0
....
Однако до 48 он достигает примерно 48на самом деле он показывает:
New runnable thread: 0
....
Как убедить Spring работать с потоком / задачей немедленно, а не ждать?
(я пробовал с различными значениями для queueCapacity
)