Создаю планировщик для тестовой обработки RejectedExecutionException:
@Component
public class TestScheduler {
private final TestService testService;
private ExecutorService executorService;
public TestScheduler(TestService testService) {
this.testService = testService;
}
@PostConstruct
public void init() {
executorService = Executors.newFixedThreadPool(5);
}
@Scheduled(fixedRate = 10L)
public void test() {
System.out.println("test");
executorService.execute(testService::print);
}
}
и службы с задержкой 70 секунд:
@Component
public class TestService {
public void print() {
System.out.println("print start");
try {
TimeUnit.SECONDS.sleep(70);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("print end");
}
}
Жду следующей логики:
- Вызов планировщика
executorService.execute(testService::print)
5 раз - Каждый
testService::print
будет выполняться 70 секунд - Когда
execute
метод будет вызываться в шестой раз, я получу RejectedExecutionException
Но я не получаю исключения.У меня есть эти журналы:
test
print start
2018-10-22 11:26:45.543 INFO 5960 --- [ main] c.e.s.SchedullerExceptionsApplication : Started SchedullerExceptionsApplication in 0.661 seconds (JVM running for 1.108)
test
print start
test
print start
test
print start
test
print start
test
...
70 seconds print test
РЕДАКТИРОВАТЬ
В реальном проекте у меня есть этот код:
@PostConstruct
public void init() {
executorService = Executors.newFixedThreadPool(100, new CustomizableThreadFactory("SendRequestExecutor-"));
}
@Scheduled(fixedDelay = 1000L)
public void sendReady() {
try {
List<Message> messages = messageService.findReadyToSend();
for (Message message : messages) {
message.setStatus(IN_PROCESS);
Message savedMessage = messageService.save(message);
executorService.execute(() -> sendRequestService.send(savedMessage.getGuid()));
}
} catch (Exception e) {
log.error("handle: " + e.getMessage());
}
}
означает ли это, что этот коднеправильно?потому что это может произойти, поэтому я поменяю сущность на статус IN_PROCESS
, а при попытке выполнить - если executorService
full, я не получу исключение и executorService
не выполнит мою задачу?