1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-sia-task

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
DEVELOPGUIDE.md 26 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 13.03.2025 22:52 30bef04

Микросервисная платформа для распределённого планирования задач

1.1 Автоматическое получение задач: правила разработки

Используйте распределённое планирование задач как в проектах Spring Boot, так и в проектах Spring. Обязательно выполните следующие требования:

1. Конфигурация клиента получения задач (Task)

Добавьте зависимость sia-task-hunter через POM-файл, как показано ниже:

<dependency>
  <groupId>com.sia</groupId>
  <artifactId>sia-task-hunter</artifactId>
  <version>1.0.0</version>
</dependency>

2. Настройка конфигурационных файлов

Настройте следующие обязательные свойства в конфигурационных файлах:

# Название проекта (обязательно)
# Правила названия: имя группы проекта - название проекта - остальное
# Пример названия: 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-запросов!

3. Настройка путей сканирования

Настройте пути сканирования для sia-task-hunter.

3.1 В проектах Spring Boot убедитесь, что пути сканирования содержат "com.sia".

Пример: @SpringBootApplication(scanBasePackages = {"com.sia", "название_вашего_проекта"})

3.2 В проектах Spring убедитесь, что пути сканирования содержат "com.sia".

Пример: <context:component-scan base-package="com.sia, название_вашего_проекта"></context:component-scan>

4. Настройка одиночной экземплярной однониточной работы

Используйте аннотацию @OnlineTask, чтобы гарантировать, что методы HTTP-запросов являются одиночными экземплярами однониточной работы.### 4.1 Конфигурация в SpringBoot

# Включает ли AOP функцию аспектов (по умолчанию true)
spring.aop.auto: true
# Включает ли @OnlineTask последовательное управление (если используется, то должно быть включено AOP) (по умолчанию true) (необязательно)
spring.onlinetask.serial: true
# Уровень метода @OnlineTask последовательного управления (если используется, то должны быть включены AOP и последовательное управление) (по умолчанию true) (необязательно)
@OnlineTask(enableSerial=true)

4.2 Конфигурация в Spring

Чтобы включить функцию AOP аспектов, добавьте конфигурационный класс:

@Configuration
@EnableAspectJAutoProxy
public class EnableAspectJAutoProxyConfig {
      // ничего
}

Только при включенном AOP, @OnlineTask последовательное управление будет работать:

# Включает ли @OnlineTask последовательное управление (если используется, то должно быть включено AOP) (по умолчанию true) (необязательно)
spring.onlinetask.serial=true
# Уровень метода @OnlineTask последовательного управления (если используется, то должны быть включены AOP и последовательное управление) (по умолчанию true) (необязательно)
@OnlineTask(enableSerial=true)

5 Пример использования @OnlineTask

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)

HTTP Доступ

Методы должны иметь аннотацию @RequestMapping, чтобы обеспечить HTTP доступ.

Пример использования аннотации RequestMapping

@RequestMapping(value = "/example", method = { RequestMethod.POST }, produces = "application/json;charset=UTF-8")

Поддержка CORS

Должна быть поддержана возможность выполнения запросов с другого домена (CORS).

Пример использования аннотации CrossOrigin

@CrossOrigin(methods = { RequestMethod.POST }, origins = "*")

Возврат значений

Используйте аннотацию @ResponseBody для возвращаемых значений. Если класс помечен как @RestController, то аннотация @ResponseBody может быть опущена. Если же класс помечен как @Controller, то аннотация @ResponseBody обязательна.

Пример использования аннотации 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);
}

4. Класс запуска приложения

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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-sia-task.git
git@api.gitlife.ru:oschina-mirror/mirrors-sia-task.git
oschina-mirror
mirrors-sia-task
mirrors-sia-task
master