SpringTask实现定时任务

优点:简单, 方便
缺点:时效性差一点

1.导包

spring-boot-starter-web 整合了SpringTask

2.代码

启动类

  1. package com.example.demo;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.scheduling.annotation.EnableScheduling;
  5. //开启SpringTask定时任务
  6. @EnableScheduling
  7. @SpringBootApplication
  8. public class DemoApplication {
  9. public static void main(String[] args) {
  10. SpringApplication.run(DemoApplication.class, args);
  11. }
  12. }

实现:

  1. package com.heima.task.job;
  2. import org.springframework.scheduling.annotation.Scheduled;
  3. import org.springframework.stereotype.Component;
  4. import java.util.Date;
  5. @Component
  6. public class HelloJob {
  7. @Scheduled(cron = "0/5 * * * * ?") //每5秒执行一次
  8. public void sing(){
  9. System.out.println("当前执行时间:"+new Date());
  10. }
  11. }

@EnableScheduling 注解的作用是发现注解@Scheduled的任务并后台执行。
@Scheduled用于标注这个方法是一个定时任务的方法
cron时间表达式是一个字符串,字符串分6个域: 秒 分 时 日 月 周
cron时间表达式一般是用百度在线生成, 不需要去记它的规则
[

](https://blog.csdn.net/weixin_42960873/article/details/106849217)

RabbitMQ实现定时任务

优点:时效性好、承受并发量大
缺点:实现复杂度高、技术要求高

Linux配置

  1. 在线拉取
  2. docker pull rabbitmq:3.8-management
  3. 加载镜像
  4. docker load -i mq.tar
  5. 创建容器
  6. docker run \
  7. -e RABBITMQ_DEFAULT_USER=momoda \
  8. -e RABBITMQ_DEFAULT_PASS=123321 \
  9. -v mq-plugins:/plugins \
  10. --name mq \
  11. --hostname mq \
  12. -p 15672:15672 \
  13. -p 5672:5672 \
  14. -d \
  15. rabbitmq:3.8-management

导包

  1. <!--mq依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-amqp</artifactId>
  5. </dependency>

配置

  1. server:
  2. port: 8801
  3. spring:
  4. application:
  5. name: task-demo
  6. rabbitmq:
  7. host: 192.168.200.130
  8. port: 5672
  9. virtual-host: /
  10. username: momoda
  11. password: 123321

代码

配置类

  1. package com.example.rabbitConfig;
  2. import org.springframework.amqp.core.*;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. @Configuration
  6. public class MqConfig {
  7. //交换机
  8. public static final String EX_A = "exchangeA";
  9. //死信交换机
  10. public static final String EX_B = "exchangeB";
  11. public static final String Q_A = "queueA";
  12. public static final String Q_B = "queueB";
  13. public static final String ROUTING_KEY_A = "exa-qa";
  14. public static final String ROUTING_KEY_B = "exb-qb";
  15. //声明 交换机
  16. @Bean(EX_A)
  17. public Exchange EX_A() {
  18. return new FanoutExchange(EX_A, true, false);
  19. }
  20. //声明 死信交换机
  21. @Bean(EX_B)
  22. public Exchange EX_B() {
  23. return new FanoutExchange(EX_B, true, false);
  24. }
  25. //声明 队列A
  26. @Bean(Q_A)
  27. public Queue Q_A() {
  28. Queue queue = new Queue(Q_A);
  29. //设置消息过期后转入哪个交换机
  30. queue.addArgument("x-dead-letter-exchange", EX_B);
  31. return queue;
  32. }
  33. //声明 队列B
  34. @Bean(Q_B)
  35. public Queue Q_B() {
  36. return new Queue(Q_B);
  37. }
  38. //绑定队列和交换机
  39. @Bean
  40. public Binding binding_A() {
  41. return BindingBuilder.bind(Q_A()).to(EX_A()).with(ROUTING_KEY_A).noargs();
  42. }
  43. //绑定队列和交换机
  44. @Bean
  45. public Binding binding_B() {
  46. //设置KEY
  47. return BindingBuilder.bind(Q_B()).to(EX_B()).with(ROUTING_KEY_B).noargs();
  48. }
  49. }

生产者

  1. package com.example.producer;
  2. import com.example.rabbitConfig.MqConfig;
  3. import org.springframework.amqp.core.Message;
  4. import org.springframework.amqp.core.MessageProperties;
  5. import org.springframework.amqp.rabbit.core.RabbitTemplate;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import java.time.LocalDateTime;
  10. @RestController
  11. public class PublishProducer {
  12. @Autowired
  13. private RabbitTemplate rabbitTemplate;
  14. @GetMapping("/publish")
  15. public String publish(){
  16. MessageProperties messageProperties = new MessageProperties();
  17. //设置过期时间 单位:毫秒
  18. messageProperties.setExpiration("1000");
  19. //设置消息
  20. Message message = new Message("HelloWorld".getBytes(), messageProperties);
  21. //放到 交换机A 对应的key
  22. rabbitTemplate.convertAndSend(MqConfig.EX_A,"MqConfig.ROUTING_KEY_A ",message);
  23. System.out.println("消息发送时间" + LocalDateTime.now());
  24. return "OK";
  25. }
  26. }

消费者

  1. package com.example.listener;
  2. import com.example.rabbitConfig.MqConfig;
  3. import org.springframework.amqp.core.Message;
  4. import org.springframework.amqp.rabbit.annotation.RabbitListener;
  5. import org.springframework.stereotype.Component;
  6. import java.time.LocalDateTime;
  7. @Component
  8. public class PublishListener {
  9. //监听队列B
  10. @RabbitListener(queues = MqConfig.Q_B)
  11. public void publish(Message message) {
  12. System.out.println("接收消息时间" + LocalDateTime.now() + " 接收到消息" + new String(message.getBody()));
  13. }
  14. }