Простой многоцелевой асинхронный фреймворк для выполнения задач.
Maven
<dependency>
<groupId>com.github.jonzhang3</groupId>
<artifactId>aTask</artifactId>
<version>1.1.0</version>
</dependency>
TaskEngine engine = new TaskEngine.Builder()
.corePoolSize(3)// Устанавливаем размер основного пула потоков, по умолчанию — количество ядер процессора
.maxPoolSize(100)// Устанавливаем максимальный размер пула потоков, по умолчанию — Integer.MAX_VALUE
.keepAliveSeconds(1000)// Устанавливаем максимальное время простоя потока, по умолчанию — 60 секунд
// Устанавливаем ёмкость очереди задач, по умолчанию — Integer.MAX_VALUE. Если значение отрицательное, используется SynchronousQueue, иначе — LinkedBlockingQueue
.queueCapacity(20)
// Устанавливаем стратегию отказа пула потоков
.rejectedExecutionHandler(RejectedExecutionHandler)
.completedTaskHandler(handler)// Устанавливаем обработчик для выполненных задач
.build();
// Можно использовать getRunningTasks() для получения текущих выполняемых задач
Task task = engine.buildTask(ctx -> {
ctx.onProgress(100);// Устанавливаем значение прогресса, вызывается функция обратного вызова прогресса
ctx.onSuccess("1", "2", "3");// Устанавливаем успешное выполнение задачи, вызывается функция обратного вызова результата
ctx.onError(Exception);// Устанавливаем неудачное выполнение задачи, вызывается функция обратного вызова результата
// Если onSuccess и onError вызваны, то сначала будет вызван onSuccess
})
.type("type")// Устанавливаем тип задачи
.progress(progress -> {})// Устанавливаем функцию обратного вызова прогресса задачи
// Устанавливаем функции обратного вызова для результата задачи. Если задача выполнена успешно, error будет null; если задача не выполнена, error не будет null
.end((ctx, error) -> {
if(error != null) {// Успешное выполнение
ctx.getResult();// Получаем данные, установленные onSuccess
} else {// Неудачное выполнение
log.error(error);// Выводим ошибку
}
})
.build();
engine.go(task);// Наконец вызываем go метода TaskEngine для выполнения задачи
task.await(); // Этот метод блокирует текущий поток. Если нужно дождаться завершения задачи перед продолжением, используйте этот метод
ResultTask<String> resultTask = engine.buildResultTask(ctx -> {
ctx.onProgress(200);
return "success";// Возвращаем результат
})
.type("type")
.progress(i -> {})
.build();
engine.go(resultTask);
// Получаем возвращаемый результат
// Этот метод блокирует текущий поток
String result = resultTask.get();
TaskGroup group = engine.prepareGroup();// Создаём группу задач
// Добавляем и выполняем задачу
group.go(group.buildItem(ctx -> {
ctx.group().incrementCounter();// Увеличиваем счётчик (потокобезопасный)
ctx.group().addData("data");// Устанавливаем данные для последующего использования
}).build());
group.await();// Ждём завершения всех задач в группе
group.getCounter();// Получаем результат счётчика
Data data = group.getData();// Получаем данные из задачи в группе (потокобезопасные)
Зарегистрировать класс ServletRegistrationBean
@Bean
public ServletRegistrationBean<StatViewServlet> druidStatViewServlet() {
TaskEngine engine = new TaskEngine.Builder()
.build();
engine.prepareGroup("test");
// Установить TaskEngine
TaskStatService.setTaskEngine(engine);
// Зарегистрировать StatViewServlet и задать путь
ServletRegistrationBean<StatViewServlet> registrationBean =
new ServletRegistrationBean<>(new StatViewServlet(), "/atask/*");
registrationBean.addInitParameter("username", "root");// Установить имя пользователя для входа
registrationBean.addInitParameter("password", "1234");// Установить пароль для входа
return registrationBean;
}
Сначала создать TaskEngine
, затем установить его в TaskStatService
// Также можно использовать другие способы
static TaskEngine engine;
static {
engine = new TaskEngine.Builder()
.build();
TaskStatService.setTaskEngine(engine);
}
Затем создать класс Servlet
и добавить аннотацию @WebServlet
@WebServlet(
urlPatterns = "/atask/*",
initParams = {
@WebInitParam(name = "username", value = "admin"),
@WebInitParam(name = "password", value = "123456"),
}
)
public class ATaskStatServlet extends StatViewServlet {
}
Не забудьте добавить аннотацию @ServletComponentScan
в класс запуска
@SpringBootApplication
@ServletComponentScan
public class DemoApplication {
}
Страница мониторинга: Мониторинг страницы.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )