Proyecto de comercio electrónico parte 03 Clasificación de servicios de soporte de comercio electrónico

Sistema de programación de tareas distribuidas

1. La instrucción contab implementa rápidamente tareas programadas simples.

Puede editar una tarea de programación simple usando directamente el comando crontab -e en una máquina Linux, que es adecuado para situaciones donde el volumen de solicitudes no es muy grande.

* * * * * echo "timer">/root/test.out

Desventajas: Solo se puede ejecutar en esta máquina, solo se puede ejecutar en el nivel de minutos.
Insertar descripción de la imagen aquí
Al configurar la expresión de cada parte, puede especificar un valor específico. Por ejemplo, el bit de minutos se establece en 0, lo que significa que Se ejecutará en el minuto 0 cada vez
. Además de estos números básicos, se permiten varios caracteres especiales:

  • representan todos los valores posibles.
  • Indica el rango especificado. Por ejemplo, configure del 1 al 10 en el bit de día, indicando del 1 al 10 de cada mes.
  • , representa una enumeración. Por ejemplo, la configuración de bits de minuto 3,5 significa ejecución en el tercer y quinto minuto.
  • / indica el incremento especificado. Por ejemplo, configurar 0/15 en el bit de minutos significa comenzar desde el minuto 0 y ejecutar cada 15 minutos. 3/20 significa que el tercer minuto comienza y se ejecuta cada 20 minutos.

También hay varios símbolos especiales que rara vez se utilizan. Por ejemplo, posiciones de día y semana. Para evitar posibles conflictos, puedes establecer uno de los valores en ?

xxljob implementa rápidamente una programación ligera de tareas distribuidas

Existen muchos marcos para implementar tareas programadas, y actualmente elasticjob y xxljob se usan con más frecuencia en China. Estos dos proyectos tienen muchos escenarios de aplicación. Entre ellos, elasticjob depende de zookeeper para la coordinación de tareas distribuidas, mientras que xxljob solo necesita coordinarse a través de la base de datos.

Caso

package com.xxl.job.service.handler;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.IJobHandler;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpJobHandler extends IJobHandler {
    
    
	@Override
	public void execute() throws Exception {
    
    
		String target = XxlJobHelper.getJobParam();
		XxlJobHelper.log("received job target:"+target);
		boolean isPostMethod= false;
		// request
		HttpURLConnection connection = null;
		BufferedReader bufferedReader = null;
		try {
    
    
			// connection
			URL realUrl = new URL(target);
			connection = (HttpURLConnection) realUrl.openConnection();
			connection.setDoOutput(isPostMethod);
			connection.setDoInput(true);
			connection.setUseCaches(false);
			connection.setReadTimeout(5 * 1000);
			connection.setConnectTimeout(3 * 1000);
			connection.setRequestProperty("connection", "Keep-Alive");
			connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
			connection.setRequestProperty("Accept-Charset","application/json;charset=UTF-8");
			// do connection
			connection.connect();
			// valid StatusCode
			int statusCode = connection.getResponseCode();
			if (statusCode != 200) {
    
    
			throw new RuntimeException("Http Request StatusCode(" +
			statusCode + ") Invalid.");
			}
			// result
			bufferedReader = new BufferedReader(new
			InputStreamReader(connection.getInputStream(), "UTF-8"));
			StringBuilder result = new StringBuilder();
			String line;
			while ((line = bufferedReader.readLine()) != null) {
    
    
				result.append(line);
			}
			String responseMsg = result.toString();
			XxlJobHelper.log(responseMsg);
			return;
		} catch (Exception e) {
    
    
			XxlJobHelper.log(e);
			XxlJobHelper.handleFail();
			return;
		} finally {
    
    
			try {
    
    
				if (bufferedReader != null) {
    
    
					bufferedReader.close();
				}
				if (connection != null) {
    
    
					connection.disconnect();
				}
			} catch (Exception e2) {
    
    
				XxlJobHelper.log(e2);
			}
		}
	}
}

En esta implementación, la dirección de destino a la que se accede, target, se pasa como parámetro de tarea. Por lo tanto, a continuación solo necesita configurar la URL en forma de parámetros en la interfaz de configuración de tareas de xxljob.
Insertar descripción de la imagen aquí

El núcleo de las tareas de cronometraje: el algoritmo de la rueda del tiempo

El algoritmo de la rueda del tiempo puede verse simplemente como implementado por 循环数组+双向链表un archivo 数据结构. La matriz de bucle forma una estructura de anillo y el puntero se mueve un paso cada vez que dura el tick. Cada nodo de la matriz está montado con una lista de tareas programadas en una estructura de lista doblemente enlazada.
Insertar descripción de la imagen aquí
Las tareas de la lista doblemente enlazada tienen un atributo llamado restanteRounds, que indica las rondas restantes de la tarea actual. Siempre que el puntero llega al nodo de datos correspondiente a la tarea, las Rondas restantes se reducen en 1. Cuando las Rondas restantes llegan a 0, se activa la tarea programada actual. A partir de este principio se puede ver que cuanto menor sea la duración del tick, más precisa será la tarea de sincronización, pero la respuesta será mayor y la carga informática sobre el sistema será mayor.

Supongo que te gusta

Origin blog.csdn.net/Forbidden_City/article/details/132379714
Recomendado
Clasificación