Presentar maven
< dependency>
< groupId> org.redisson</ groupId>
< artifactId> redisson</ artifactId>
< version> 3.13.3</ version>
</ dependency>
Mejores prácticas para las colas de retraso
Primero, defina un trabajo retrasado, que contiene un parámetro de mapa, y la clase de implementación específica del ejecutor de cola. Cuando se activa la ejecución de la tarea, el parámetro de mapa se pasará a la implementación del ejecutor de negocios específico
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DelayJob implements Serializable {
private static final long serialVersionUID = - 7558558883792921429 L;
private Map< String, Object> jobParams;
private String executeTime;
private Class clazz ;
}
Defina una interfaz de ejecución de trabajos retrasada, la empresa necesita implementar esta interfaz y luego escribir su propia lógica empresarial en el método de ejecución
public interface DelayJobExecutor {
void execute ( DelayJob job) ;
}
Consuma el servicio de trabajo retrasado que ha expirado y llame al ejecutor comercial a través de los parámetros del trabajo para lograr
@Component
public class JobTimer {
static final String jobsTag = "customer_jobtimer_jobs" ;
@Autowired
private RedissonClient client;
@Autowired
private ApplicationContext context;
ExecutorService executorService = Executors. newFixedThreadPool ( Runtime. getRuntime ( ) . availableProcessors ( ) * 2 ) ;
@PostConstruct
public void startJobTimer ( ) {
RBlockingQueue blockingQueue = client. getBlockingQueue ( jobsTag) ;
RDelayedQueue< DelayJob> delayedQueue = client. getDelayedQueue ( blockingQueue) ;
delayedQueue. offer ( null, 1 , TimeUnit. SECONDS) ;
new Thread ( ( ) - > {
while ( true ) {
try {
DelayJob job = blockingQueue. take ( ) ;
log. info ( "获取到延迟任务:{}, 剩余任务数:{}" , job, delayedQueue. size ( ) ) ;
if ( job == null) {
continue ;
}
executorService. execute ( new ExecutorDelayTask ( context, job) ) ;
} catch ( Exception e) {
log. error ( "执行延迟任务出现异常,异常原因:{}" , e. getMessage ( ) , e) ;
try {
TimeUnit. SECONDS. sleep ( 60 ) ;
} catch ( InterruptedException ex) {
ex. printStackTrace ( ) ;
}
}
}
} , "delayJobTimer" ) . start ( ) ;
log. info ( "init startDelayJobTimer success" ) ;
}
class ExecutorTask implements Runnable {
private ApplicationContext context;
private DelayJob delayJob;
public ExecutorTask ( ApplicationContext context, DelayJob delayJob) {
this . context = context;
this . delayJob = delayJob;
}
@Override
public void run ( ) {
ExecuteJob service = ( ExecuteJob) context. getBean ( delayJob. getaClass ( ) ) ;
service. execute ( delayJob) ;
}
}
}
Paquete de servicio de trabajo retrasado
@Component
@Slf4j
public class DelayJobService {
@Resource
private RedissonClient client;
public void submitJob ( DelayJob job, Long delay, TimeUnit timeUnit) {
if ( delay <= 0 ) {
log. error ( "[submitJob] 延迟时间不能小于0, 任务:{},延迟时间:{}" , job, delay) ;
return ;
}
RBlockingQueue< Object> blockingQueue = client. getBlockingQueue ( DelayJobTimer. delayJobsTag, JsonJacksonCodec. INSTANCE) ;
RDelayedQueue delayedQueue = client. getDelayedQueue ( blockingQueue) ;
delayedQueue. offer ( job, delay, timeUnit) ;
log. info ( "[submitJob] 添加延迟任务成功,job:{}" , job) ;
}
}