Используйте распределённое планирование задач как в проектах Spring Boot, так и в проектах Spring. Обязательно выполните следующие требования:
Task
)Добавьте зависимость sia-task-hunter
через POM-файл, как показано ниже:
<dependency>
<groupId>com.sia</groupId>
<artifactId>sia-task-hunter</artifactId>
<version>1.0.0</version>
</dependency>
Настройте следующие обязательные свойства в конфигурационных файлах:
# Название проекта (обязательно)
# Правила названия: имя группы проекта - название проекта - остальное
# Пример названия: skytrain-supervise, где группа проекта называется skytrain
spring.application.name=spring-3.x-test
# Порт приложения (обязательно)
server.port=8080
# Адрес Zookeeper (обязательно)
# Пример конфигурирования адреса Zookeeper с использованием IP: *. *. *. *:2181,*. *. *. *:2181,*. *. *. *:2181
# Пример конфигурирования адреса Zookeeper с использованием домена: домен1:2181, домен2:2181, домен3:2181
zookeeper.hosts=127.0.0.1:2181
# Контекст приложения (не обязательно)
server.context-path=/spring-3.x-test
server.context-path
:(1) В проектах Spring Boot настройка контекста приложения осуществляется в файле application.yml
, добавив свойство:
server.context-path: /ПУТЬ/КОНТЕКСТА
(2) В проектах Spring настройка контекста приложения осуществляется в файле server.xml
Tomcat, добавив:
<Context path="/ПУТЬ/КОНТЕКСТА"/>
Для обеспечения согласованности с проектами Spring Boot, в проектах Spring требуется добавить следующее в конфигурационные файлы (которые могут быть загружены в контекст):
server.context-path=/ПУТЬ/КОНТЕКСТА (приложение Spring)
В любом случае, важно гарантировать правильность HTTP-пути доступа:
IP:${server.port}/${server.context-path}/${путь_до_класса}/${путь_до_метода}
Этот путь должен быть доступен для POST-запросов!
Настройте пути сканирования для sia-task-hunter
.
"com.sia"
.Пример: @SpringBootApplication(scanBasePackages = {"com.sia", "название_вашего_проекта"})
"com.sia"
.Пример: <context:component-scan base-package="com.sia, название_вашего_проекта"></context:component-scan>
Используйте аннотацию @OnlineTask
, чтобы гарантировать, что методы HTTP-запросов являются одиночными экземплярами однониточной работы.### 4.1 Конфигурация в SpringBoot
# Включает ли AOP функцию аспектов (по умолчанию true)
spring.aop.auto: true
# Включает ли @OnlineTask последовательное управление (если используется, то должно быть включено AOP) (по умолчанию true) (необязательно)
spring.onlinetask.serial: true
# Уровень метода @OnlineTask последовательного управления (если используется, то должны быть включены AOP и последовательное управление) (по умолчанию true) (необязательно)
@OnlineTask(enableSerial=true)
Spring
Чтобы включить функцию AOP аспектов, добавьте конфигурационный класс:
@Configuration
@EnableAspectJAutoProxy
public class EnableAspectJAutoProxyConfig {
// ничего
}
Только при включенном AOP, @OnlineTask последовательное управление будет работать:
# Включает ли @OnlineTask последовательное управление (если используется, то должно быть включено AOP) (по умолчанию true) (необязательно)
spring.onlinetask.serial=true
# Уровень метода @OnlineTask последовательного управления (если используется, то должны быть включены AOP и последовательное управление) (по умолчанию true) (необязательно)
@OnlineTask(enableSerial=true)
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.example.*;
``````java
gantry.onlinetask.annotation.OnlineTask;
import com.gantry.onlinetask.helper.JSONHelper;
@RestController
public class OnlineTaskExample {
/**
* Пример использования @OnlineTask, стандартный формат
*
* (1) Метод имеет аннотацию @OnlineTask, которая указывает, был ли он захвачен. Можно добавить описание, чтобы объяснить цель этого Task
*
* (2) Метод имеет аннотацию @RequestMapping, потому что OnlineTask должен предоставлять HTTP доступ
*
* (3) В аннотации @RequestMapping используйте свойство value (или path), поскольку в ранних версиях Spring нет свойства path (для совместимости сначала проверяем значение value), и путь начинается со слеша "/". Путь не должен содержать обратной косой черты "\"
*
* (4) В аннотации @RequestMapping метод должен обязательно содержать POST запрос (требуется передача параметров), а также использовать аннотацию @CrossOrigin для поддержки cross-origin запросов (по умолчанию POST запросы не поддерживают cross-origin) или применять фильтры (Filter) для обеспечения возможности cross-origin для задач.
*
* (5) Используйте аннотацию @ResponseBody для пометки возвращаемого значения. Если класс использует аннотацию @RestController, то использование @ResponseBody является необязательным, если же используется @Controller, то @ResponseBody обязательна.
*/
}
``` * (6) Метод должен возвращать строку (JSON), где JSON представляет собой карту с обязательным свойством "status", значение которого может быть одним из значений {success, failure, unknown}, используемых для логики обработки; должно присутствовать обязательное свойство "result", значение которого представляет собой ответ HTTP-запроса.
* <p>
* (7) Метод может принимать ноль параметров; если параметры есть, то они должны быть одного типа String (JSON), и следует использовать аннотацию @RequestBody для пометки этого параметра.
* <p>
* (8) Аннотация @OnlineTask использует AOP-технологию для гарантии того, что вызываемый метод будет работать в одном экземпляре и однопоточном режиме.
* <p>
* (9) Обработка бизнес-логики OnlineTask должна быть как можно более idempotentной.
* <p>
* (10) Поддерживаются классы, использующие аннотацию @RequestMapping.
* /
*
* @param json
* @return
*/
// (1) Метод имеет аннотацию @OnlineTask, которая указывает, был ли он захвачен. Можно добавить описание description, которое объясняет назначение данного Task.
@OnlineTask(description = "Пример онлайн-задачи", enableSerial = true)
// (2) Метод имеет аннотацию @RequestMapping, так как OnlineTask должен предоставлять доступ через HTTP.
// (3) В аннотации @RequestMapping следует использовать атрибут value (или path), так как в ранних версиях Spring отсутствовал атрибут path (для совместимости).Адрес должен начинаться со слеша "/" (для упрощения обработки), путь не должен содержать обратного слэша "\".
@RequestMapping(value = "/example", method = { RequestMethod.POST }, produces = "application/json;charset=UTF-8")
// (4) В аннотации @RequestMapping метод должен обязательно содержать POST запрос (требуется передача параметров), а также использовать аннотацию @CrossOrigin для поддержки cross-origin запросов (по умолчанию POST запросы не поддерживают cross-origin) или применять фильтры (Filter) для обеспечения возможности cross-origin для задач.
@CrossOrigin(methods = { RequestMethod.POST }, origins = "*")
// (5) Используйте аннотацию @ResponseBody для пометки возвращаемого значения. Если класс использует аннотацию @RestController, то использование @ResponseBody является необязательным, если же используется @Controller, то @ResponseBody обязательна.
@ResponseBody
// (6) Метод должен возвращать строку (JSON), где JSON представляет собой Map с обязательным свойством "status", значение которого может быть одним из значений {success, failure, unknown}, используемых для логики обработки; должно присутствовать обязательное свойство "result", значение которого представляет собой ответ HTTP запроса. Должна присутствовать атрибут "result", значение которого должно быть возвращаемым значением HTTP-запроса
// (7) метод может принимать ноль параметров; если есть параметры, то они должны быть одного типа - String (JSON), используйте аннотацию @RequestBody
public String example(@RequestBody String json) {
/**
```markdown
# 1. Автоматическое получение задачи: пример кода
## 1. `POM` файл
```xml
<проект xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Настройка имени проекта, пожалуйста, замените самостоятельно -->
<groupId>com.creditease</groupId>
<artifactId>onlinetask-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- Базовая конфигурация, начинается -->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.boot.version>1.5.11.RELEASE</spring.boot.version>
<spring.cloud.version>Dalston.SR5</spring.cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
/**
* TODO: реализация бизнес-логики клиента
*/
// структура данных для хранения информации о результате, используйте Map
Map<String, String> info = new HashMap<>();
// информация должна содержать следующие два поля
info.put("status", "success"); // поле status указывает успешность вызова задачи, все значения кроме "success" считаются ошибочными
info.put("result", "как вам будет удобно"); // поле result представляет собой результат выполненной задачи (может передаваться другим задачам), его значение должно быть типа String (JSON)
// тип возвращаемого значения также String (JSON), клиентская библиотека содержит JSONHelper, который можно использовать напрямую
return JSONHelper.toString(info);
}
}
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<!-- Импорт управления зависимостями от Spring Cloud -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- Базовая конфигурация, завершена -->
<dependencies>
<!-- Базовые зависимости, начата -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Базовые зависимости, завершена -->
<!-- Здесь добавьте специфичные зависимости -->
<dependency>
<groupId>com.sia</groupId>
<artifactId>sia-task-hunter</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<!-- Упаковка конфигурации -->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</build>```markdown
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
```
## 2. Конфигурационные файлы
```yml
# Название проекта (обязательно)
spring.application.name: onlinetask-client
# Порт приложения (обязательно)
server.port: 10086
# Адрес Zookeeper (обязательно)
zooKeeperHosts: *. *. *. *:2181,*. *. *. *:2181,*. *. *. *:2181
# Контекст приложения (не обязательно)
server.context-path: /
# Включить ли AOP функционал (по умолчанию true)
spring.aop.auto: true
# Включить ли @OnlineTask последовательное управление (если используется, то AOP должно быть включено) (по умолчанию true) (не обязательно)
spring.online-task.enabled: true
## 3. `контроллер`
``````java
package com.creditease.online.example;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.gantry.onlinetask.annotation.OnlineTask;
import com.gantry.onlinetask.helper.JSONHelper;
@RestController
public class OnlineTaskExample {
``` /**
* Пример OnlineTask в стандартном формате
*
* (1) Метод имеет аннотацию @OnlineTask, которая указывает, что он был захвачен. Можно добавить описание description, которое объясняет назначение этого Task.
*
* (2) Метод имеет аннотацию @RequestMapping, так как OnlineTask должен предоставлять HTTP доступ.
*
* (3) В аннотации @RequestMapping используйте атрибут value (или path). Поскольку старые версии Spring не имеют атрибута path, для совместимости приоритет отдается значению атрибута value. Адрес должен начинаться с "/", чтобы уменьшить сложность обработки. Адрес не может содержать "\" (используется для замены).
*
* (4) В методе @RequestMapping обязательно должен быть POST метод (требует передачи параметров), и использовать @CrossOrigin для поддержки cross-origin запросов (POST метод по умолчанию не позволяет cross-origin запросы) или использовать фильтр Filter для того, чтобы Task мог работать через cross-origin.
*
* (5) Используйте @ResponseBody для аннотации возвращаемого значения. Если на классе используется @RestController, то @ResponseBody можно не использовать, если же используется @Controller, то @ResponseBody обязателен.
*
* (6) Возвращаемое значение метода должно быть String (JSON), JSON — это Map, которая должна иметь свойство "status", значение которого может быть {success, failure, unknown}, для обработки логики; также должно быть свойство "result", значение которого является возвратом HTTP запроса.
*
*/ * (7) Метод может принимать параметры или быть без параметров. Если есть входной параметр, то он должен быть единственным и типа `String` (JSON), и его следует аннотировать `@RequestBody`.
*
* (8) Аннотация `@OnlineTask` использует AOP технологию, что гарантирует, что вызываемый метод будет единичным и однопоточным.
*
* (9) Бизнес-логика `OnlineTask` должна обеспечивать идемпотентность (неизменяемость).
*
* (10) Поддерживаются классы с использованием аннотации `@RequestMapping`.
*/}
``````markdown
## 1. Аннотация OnlineTask
### Описание
Аннотация `@OnlineTask` используется для указания того, был ли метод захвачен. Можно добавить описание (`description`) для объяснения назначения задачи.
#### Пример использования аннотации
```java
@OnlineTask(description = "Пример онлайн-задачи", enableSerial = true)
Методы должны иметь аннотацию @RequestMapping
, чтобы обеспечить HTTP доступ.
@RequestMapping(value = "/example", method = { RequestMethod.POST }, produces = "application/json;charset=UTF-8")
Должна быть поддержана возможность выполнения запросов с другого домена (CORS).
@CrossOrigin(methods = { RequestMethod.POST }, origins = "*")
Используйте аннотацию @ResponseBody
для возвращаемых значений. Если класс помечен как @RestController
, то аннотация @ResponseBody
может быть опущена. Если же класс помечен как @Controller
, то аннотация @ResponseBody
обязательна.
@ResponseBody
public String example(@RequestBody String json) {
// Логика бизнес-логики
Map<String, String> info = new HashMap<>();
// Обязательные поля
info.put("status", "success"); // Указывает успешность вызова задачи
info.put("result", "as you need"); // Указывает результат вызова задачи
// Преобразование данных в JSON
return JSONHelper.toString(info);
}
package com.creditease;
``````java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// Обязательно переопределите диапазон сканирования пакетов
@SpringBootApplication(scanBasePackages = { "com.sia"})
public class OnlineTaskClientApp {
private static final Logger LOGGER = LoggerFactory.getLogger(OnlineTaskClientApp.class);
public static void main(String[] args) {
SpringApplication.run(OnlineTaskClientApp.class, args);
LOGGER.info("Запуск OnlineTaskClient!");
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )