任务调度功能实现

一.引入依赖

因为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();
            }
        }
    }
相关推荐
Wang's Blog3 分钟前
Java 中间件之 RabbitMQ 快速入门: MQ 常见技术选型对比
java·中间件·java-rabbitmq
蜗牛互联网3 分钟前
Java Agent 工具调用的 allowlist、参数校验与调用预算
java·开发语言·人工智能·后端·oracle
大文说跨境4 分钟前
多账号环境隔离方案技术选型:指纹浏览器、VPS 与云手机的三种架构对比
java·开发语言·前端
chenbingjie_c6 分钟前
手撕 C++ priority_queue:二叉堆 + 模板仿函数 + 模板特化(保姆级逐函数拆解)
开发语言·c++
骉马代驾12 分钟前
代驾系统长连接实战(二):心跳、断线重连与消息补偿的完整实现
java
ttwuai16 分钟前
Go后台管理系统开源项目有哪些?如何按交付形态筛掉不合适的仓库
开发语言·golang·开源
程序员Sunday18 分钟前
Spring @Transactional 没回滚?按代理调用、异常和传播行为排查
java·后端·spring
冰暮流星27 分钟前
sql之is null 运算符
java·数据库·sql
Rain的Java大神之路28 分钟前
🔥13年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·后端·面试
yuniko-n28 分钟前
【Java】关于容器选型:Deque、PriorityQueue、LinkedList
java·开发语言