Первая версия Angle.M1 — милицейская версия. Вторая версия Angle.M2 — Yöntem 20191007
<dependency>
<groupId>com.brave</groupId>
<artifactId>brave-disjob-spring-boot-starter</artifactId>
<version>Angle.M1</version>
</dependency>
brave:
jobs:
- job: demo1
- job: demo2
register:
center: localhost:2181
switcher: on
demo1:
switcher: on
cron: 0/30 * * * * ?
demo2:
switcher: on
cron: 0/40 * * * * ?
Здесь Switcher:on
можно опустить, так как он предназначен для глобального включения/выключения.Добавление основного распределителя задач
@Slf4j
@Component
public class MainWorker extends BaseWorkerRegister {
@JobName(name = "demo1")
public String jobName;
@Override
public void run(@NotNull String ids) {
try {
TimeUnit.SECONDS.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Обработка списка, получение максимального и минимального ID, при выполнении задачи необходимо обеспечить атомарность операций, чтобы использовать этот алгоритм распределения.
List<Integer> idList = processItem(ids);
int minId = idList.stream().min(Integer::compare).orElse(0);
int maxId = idList.stream().max(Integer::compare).orElse(0);
log.info("{} минимум: {}, максимум: {}", jobName, minId, maxId);
}
/**
* Регистрация worker'а.
*/
@PostConstruct
public void init() {
super.init_1(jobName);
}
}
Метод run
, принимает параметр ids
, который представляет собой диапазон распределения для каждого узла. Поэтому ваша логика выполнения задач должна быть реализована внутри этого метода. Необходимо добавить метод init
в этот класс, просто скопировав его.
Добавление обработчика потока
@Slf4j
@Component
public class MainDispatcher extends Dispatcher {
@Value("${demo1.switcher}")
private String switcher;
@JobName(name = "demo1")
private String jobName;
@Scheduled(cron = "${demo1.cron}")
public void process() {
if (switcher == null || "off".equals(switcher)) {
log.info("Распределённая задача отключена.");
return;
}
run(jobName);
}
/**
* Обработка задачи
*/
@Override
public void dispatchWork() {
// Получение списка ID
List<Integer> ids = Arrays.asList(1, 2, 3, 4, 5, 6);
writeWorkerData(jobName, ids);
}
}
```Здесь следует обратить внимание на следующие моменты:
* `switcher` — это переключатель задачи, который конфигурируется в файле конфигурации.
* `jobName` — имя задачи, которое задается с помощью специального аннотированного поля и должно совпадать с именем задачи в файле конфигурации.
* В этом классе есть два основных метода: первый — метод запуска, второй — метод распределения задач.
После создания этих двух классов можно будет запустить приложение, однако потребуется наличие кластера Zookeeper, где все данные будут регистрироваться.
## Версия Angel.M2
* Улучшена регистрация информации о рабочих узлах, если такой узел уже существует, то он не будет заново зарегистрирован.
* Улучшены объекты рабочего узла, они выглядят следующим образом:
```java
@Slf4j
@Component
@EnableBraveDisJob(name = "demo3")
public class MainWorker extends BaseWorkerRegister {
private String jobName;
@Override
public void run(@NotNull String ids) {
try {
TimeUnit.SECONDS.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Обработка списка, получение минимального и максимального ID
List<Integer> idList = processItem(ids);
int minId = idList.stream().min(Integer::compare).orElse(0);
int maxId = idList.stream().max(Integer::compare).orElse(0);
log.info("{} минимум {}, максимум {}", jobName, minId, maxId);
}
}
```Сейчас достаточно реализовать метод `run`. Если требуется выводить или записывать информацию о задаче, можно использовать поле `jobName`, которое автоматически будет проинициализировано значением имени задачи из конфигурации.
## 20191012 Улучшения
* Добавлен атрибут job switcher и зарегистрирован в zookeeper.
* Конфигурация в yml файле:
```yml
brave:
jobs:
- job: demo3
switcher: on
def register_job_switcher(job_name): # Логика регистрации job switcher pass
register_job_switcher('демо3')
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )