一.引入依赖
因为springboot中包含了spring Task框架,所以spring boot项目不需要引入依赖
二.在启动类上添加@EnableScheduling注解
三.在方法上加入@Scheduled(cron = "*/1 * * * * ?")实现的任务调度
@Service
@Slf4j
public class TaskServiceImpl implements TaskService {
@Autowired
private RedisService redisService;
@Autowired
ComfyuiApi comfyuiApi;
@Override
public void addQueueTask() {
ComfyuiTask queueTask = redisService.getQueueTask();
if (queueTask == null) {
return;
}
try {
Response<HashMap> response = comfyuiApi.addQueueTask(queueTask.getComfyuiRequestDto()).execute();
if(response.isSuccessful()){
log.info("任务添加成功:{}", response.body());
Object o = response.body().get("prompt_id");
queueTask.setPromptId(o.toString());
}else{
log.error("任务添加失败:{}", response.errorBody());
}
} catch (IOException e) {
e.printStackTrace();
log.error("任务添加失败:{}", e.getMessage());
}
}
@Scheduled(cron = "*/1 * * * * ?")
public void task(){
addQueueTask();
}
}
四.处理多集群问题-----分布式锁
因为多个处理器中同时队comfyui发送请求,就炸了,因为comfyui只能一次处理一个文生图请求
1.配置Redission
<1>配置Reddisonclient
<2>配置StringReidsTemplate连接工厂
@Configuration
public class RedissonConfig {
//配置redissonclient
@Bean
public RedissonClient redissonConfig(RedisProperties redisProperties){
Config config = new Config();
config.useSingleServer().setAddress(String.format("redis://%s:%s",redisProperties.getHost(),redisProperties.getPort()));
return Redisson.create(config);
}
//配置stringRedisTemplate
@Bean
public StringRedisTemplate stringRedisTemplate(RedisProperties redisProperties){
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisProperties.getHost(),redisProperties.getPort());
lettuceConnectionFactory.start();
return new StringRedisTemplate(lettuceConnectionFactory);
}
}
2.上锁
@Scheduled(cron = "*/1 * * * * ?")
public void task(){
RLock lock = redissonClient.getLock(Lock_KEY);
if(lock.tryLock()){
try {
log.info("添加锁成功");
addQueueTask();
} finally {
lock.unlock();
}
}
}