Elástica de empleo: añadir dinámicamente tareas de apoyo a la fragmentación dinámica

Apasionado Corte sólo meses de primavera, de acuerdo a Utah para el alejamiento de las personas.
Aquí Insertar imagen Descripción

contorno

Debido a las fechas de las tareas utilizadas en el proyecto, y el despliegue de instancias de servicios múltiples, es necesario resolver el problema de la tarea programada repetida. Es decir, el tiempo de cada tarea ejecutada sólo en un nodo a la vez. programas de código abierto comunes, tales como elastic-job, xxl-job, quartz, saturn, opencron, antaresy así sucesivamente. La decisión final de usar elastic-job. elastic-jobLos puntos principales son los siguientes:

  1. Basado en el marco basado en cuarzo tarea de temporización, por lo que la mayor parte de las funciones proporcionadas cuarzo
  2. Uso empleado del zoológico hacer la coordinación, centros de despacho, más ligera
  3. tareas de apoyo rebanadas
  4. Apoyar la expansión elástica, se puede expandir horizontalmente, cuando una tarea se ejecuta de nuevo, va a comprobar el número actual de servidores, re-rebanada, continuará su misión después del final de la rebanada
  5. Conmutación por error, tolerancia a fallos, cuando un servidor de programación se ha reducido o se desconecta con el cuidador del zoológico, se detendrá inmediatamente, y luego ir en busca de otro servidor de programación libre, para ejecutar las tareas pendientes
  6. Proporcionar un funcionamiento y la interfaz de mantenimiento, se puede administrar trabajos y Centro de Registro

Pero se encuentra en el desarrollo real de elastic-joblas tareas de sincronización añadidos dinámicamente no está fragmentado. Es decir, en el caso de múltiples instancias, añadir dinámicamente tareas en una instancia, la tarea se ejecutará siempre en este nodo de estación. Si necesita ejecutar en otros casos, las interfaces de llamada a otras instancias de los mismos parámetros. Referencia: Elástico del empleo: añadir dinámicamente tareas . En una serie de Baidu googleencuentra bajo elástico-Trabajo añadir dinámicamente tareas aquí y el propietario se encontró con el mismo problema. Pero buen trabajo mediante la adición dinámica de fragmentación prueba de mal arrendador, y siempre que el zookeeperregistro de la tarea, la tarea de inicialización automáticamente o reiniciar. (Descripción de las tareas dinámicas se puede referir a la descripción foro aquí es no hacer demasiado explicación).

resolver

A lo largo de grandes Yin las ideas, las tareas de nodo se gestionan de forma centralizada en conjunto, independientemente de la tarea dinámica a inscribirse en qué nodo, que necesitamos para reenviar la solicitud para iniciar el funcionamiento en otros nodos, a fin de garantizar un fragmento de múltiples nodos se llevó a cabo correctamente.

Código es el siguiente:

/**
     * 开启任务监听,当有任务添加时,监听zk中的数据增加,自动在其他节点也初始化该任务
     */
    public void monitorJobRegister() {
        CuratorFramework client = zookeeperRegistryCenter.getClient();
        @SuppressWarnings("resource")
        PathChildrenCache childrenCache = new PathChildrenCache(client, "/", true);
        PathChildrenCacheListener childrenCacheListener = new PathChildrenCacheListener() {
            public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
                ChildData data = event.getData();
                switch (event.getType()) {
                    case CHILD_ADDED:
                        String config = new String(client.getData().forPath(data.getPath()   "/config"));
                        Job job = JsonUtils.toBean(Job.class, config);
                        Object bean = null;
                        // 获取bean失败则添加任务
                        try {
                            bean = ctx.getBean("SpringJobScheduler"   job.getJobName());
                        } catch (BeansException e) {
                            logger.error("ERROR NO BEAN,CREATE BEAN SpringJobScheduler"   job.getJobName());
                        }
                        if (Objects.isNull(bean)) {
                            addJob(job);
                        }
                        break;
                    default:
                        break;
                }
            }
        };
        childrenCache.getListenable().addListener(childrenCacheListener);
        try {
            // https://blog.csdn.net/u010402202/article/details/79581575
            childrenCache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

prueba

Prueba de añadir dinámicamente las tareas regulares de conmutación por error, el apoyo fragmentación.

  1. Descargar el elástico-trabajo-primavera-arranque- motor de arranque utilizando un mavencomando installa nivel local
  2. Crear un demo-elastic-jobproyecto de
    estructura de directorios es la siguiente:
demo-elastic-job
├── mvnw
├── mvnw.cmd
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── demo
│   │   │               ├── job
│   │   │               │   ├── DynamicJob.java
│   │   │               │   └── TestJob.java
│   │   │               └── DemoApplication.java
│   │   └── resources
│   │       ├── application.yml
│   │       └── application-dev.yml
│   └── test
│       └── java
│           └── com
│               └── example
│                   └── demo
│                       └── DemoApplicationTests.java
├── pom.xml
└── demo.iml

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.cxytiandi</groupId>
            <artifactId>elastic-job-spring-boot-starter</artifactId>
            <version>1.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

DemoApplication.java

package com.example.demo;

import com.cxytiandi.elasticjob.annotation.EnableElasticJob;
import com.cxytiandi.elasticjob.dynamic.service.JobService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableElasticJob
@ComponentScan(basePackages = {"com.cxytiandi", "com.example.demo"})
public class DemoApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Autowired
    private JobService jobService;

    @Override
    public void run(String... args) throws Exception {
        // 模拟初始化读取数据库 添加任务
//        Job job1 = new Job();
//        job1.setJobName("job1");
//        job1.setCron("0/10 * * * * ? ");
//        job1.setJobType("SIMPLE");
//        job1.setJobClass("com.example.demo.job.DynamicJob");
//        job1.setShardingItemParameters("");
//        job1.setShardingTotalCount(2);
//        jobService.addJob(job1);
//        Job job2 = new Job();
//        job2.setJobName("job2");
//        job2.setCron("0/10 * * * * ? ");
//        job2.setJobType("SIMPLE");
//        job2.setJobClass("com.example.demo.job.DynamicJob");
//        job2.setShardingItemParameters("0=A,1=B");
//        job2.setShardingTotalCount(2);
//        jobService.addJob(job2);
    }
}

TestJob.java

package com.example.demo.job;

import com.cxytiandi.elasticjob.annotation.ElasticJobConf;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

/**
 * Created by zhenglongfei on 2019/7/22
 *
 * @VERSION 1.0
 */
@Component
@Slf4j
@ElasticJobConf(name = "dayJob", cron = "0/10 * * * * ?", shardingTotalCount = 2,
        shardingItemParameters = "0=AAAA,1=BBBB", description = "简单任务", failover = true)
public class TestJob implements SimpleJob {
    @Override
    public void execute(ShardingContext shardingContext) {
        log.info("TestJob任务名:【{}】, 片数:【{}】, param=【{}】", shardingContext.getJobName(), shardingContext.getShardingTotalCount(),
                shardingContext.getShardingParameter());
    }
}

DynamicJob.java

package com.example.demo.job;

import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * Created by zhenglongfei on 2019/7/24
 *
 * @VERSION 1.0
 */
@Component
@Slf4j
public class DynamicJob implements SimpleJob {
    @Override
    public void execute(ShardingContext shardingContext) {


        switch (shardingContext.getShardingItem()) {
            case 0:
                log.info("【0】 is running");
                break;
            case 1:
                log.info("【1】 is running");
                break;
        }
    }
}

application.yml

elastic:
  job:
    zk:
      serverLists: 172.25.66.137:2181
      namespace: demo_test
server:
  port: 8082
spring:
  redis:
    host: 127.0.0.1
    port: 6379

resultados de la prueba

Dos proyectos se iniciaron 8081y 8082puertos, utilizan REST APIpara registrar dinámicamente la tarea.

  • trabajo
    Aquí Insertar imagen Descripción

http: // localhost: 8081 / trabajo colocar
parámetros son los siguientes:

{
  "jobName": "DynamicJob01",
  "cron": "0/3 * * * * ?",
  "jobType": "SIMPLE",
  "jobClass": "com.example.demo.job.DynamicJob",
  "jobParameter": "test",
  "shardingTotalCount": 2,
  "shardingItemParameters": "0=AAAA,1=BBBB"
}

Aquí Insertar imagen Descripción

descargar


Aquí Insertar imagen Descripción

??? atención a las micro-canal público número java seca
de vez en información en tiempo seco compartir

Enlaces de referencia:

Publicados 112 artículos originales · ganado elogios 90 · Vistas de 350.000 +

Supongo que te gusta

Origin blog.csdn.net/dandandeshangni/article/details/101021771
Recomendado
Clasificación