项目中使用Cron与RabbitMQ实现定时任务

实现思路:在定时任务中引入rabbitmq的模块,rabbitmq模块添加对应的消息监听,在定时任务模块使用cron的方式配置定时任务。

新建模块service_task,添加依赖,引入之前创建的mq工具类模块

<dependencies>
        <dependency>
            <groupId>com.lzq</groupId>
            <artifactId>rabbit_util</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
 </dependencies>

配置文件

# 服务端口
server.port=8208
# 服务名
spring.application.name=service-task
# 环境设置:dev、test、prod
spring.profiles.active=dev
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8888
#rabbitmq地址
spring.rabbitmq.host=192.168.8.139
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

创建启动类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
public class ServiceTaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceTaskApplication.class, args);
    }
}

在rabbit-util模块MqConst类添加

//定时任务
public static final String EXCHANGE_DIRECT_TASK = "exchange.direct.task";
public static final String ROUTING_TASK_8 = "task.8";
//队列
public static final String QUEUE_TASK_8 = "queue.task.8";

Task模块对应类

@Component
@EnableScheduling
public class ScheduledTask {
    @Autowired
    private RabbitService rabbitService;
    /**
     * cron表达式设置规则
     * 每天8点执行 提醒就诊
     */
    @Scheduled(cron = "0 0 8 * * ?")  //每天8点
//    @Scheduled(cron = "0/10 * * * * ?")
    public void task1() {
        System.out.println(new Date().toLocaleString());
        //发送短信
        rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_TASK, MqConst.ROUTING_TASK_8,"");
    }
}

添加mq监听

@Component
public class OrderReceiver {
    @Autowired
    private OrderInfoService orderService;
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = MqConst.QUEUE_TASK_8, durable = "true"),
            exchange = @Exchange(value = MqConst.EXCHANGE_DIRECT_TASK),
            key = {MqConst.ROUTING_TASK_8}
    ))
    public void patientTips(Message message, Channel channel) throws IOException {
        orderService.patientTips();
    }
}

OrderService接口和实现

 @Override
    public void patientTips() {
        //查询当天就诊人手机号
        QueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("reserve_date", new DateTime().toString("yyyy-MM-dd"));
        //未取消预约的订单
        queryWrapper.ne("order_status",-1);
        List<OrderInfo> orderInfoList = baseMapper.selectList(queryWrapper);
        for (OrderInfo orderInfo : orderInfoList) {
            //短信提示
            MsmVo msmVo = new MsmVo();
            msmVo.setPhone(orderInfo.getPatientPhone());
            rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_TASK, MqConst.ROUTING_TASK_8,msmVo);
        }
    }

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java可以使用cron表达式来实现定时任务cron表达式由7个时间元素组成,分别为秒、分、时、日期、月份、星期几和年份。其,年份是可选的,一般不需要指定。Spring 4.x的Spring Task只支持前6个时间元素,而Quartz框架则支持完整的7个时间元素。 下面是一个使用Java实现定时任务的示例代码: ```java import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class CronScheduler { public static void main(String[] args) throws SchedulerException { // 创建调度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 创建任务 JobDetail job = JobBuilder.newJob(MyJob.class).build(); // 创建触发器,使用cron表达式 Trigger trigger = TriggerBuilder.newTrigger() .withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?")) // 每天午12点执行 .build(); // 将任务和触发器绑定到调度器 scheduler.scheduleJob(job, trigger); // 启动调度器 scheduler.start(); } } public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 在这里写你的定时任务逻辑 System.out.println("定时任务执行了"); } } ``` 上述代码,首先创建了一个调度器对象,然后创建了一个任务对象(实现了Job接口),并创建了一个触发器对象,通过`withSchedule`方法传入cron表达式来指定任务执行的时间。最后,将任务和触发器绑定到调度器,并启动调度器。 以上就是使用Java实现定时任务的简单示例。你可以根据需要自定义定时任务的逻辑和cron表达式来实现不同的定时功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远走与梦游

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值