SpringTask实现定时任务
1.导包
spring-boot-starter-web 整合了SpringTask
2.代码
启动类
package com.example.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.scheduling.annotation.EnableScheduling;//开启SpringTask定时任务@EnableScheduling@SpringBootApplicationpublic class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
实现:
package com.heima.task.job;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;import java.util.Date;@Componentpublic class HelloJob {@Scheduled(cron = "0/5 * * * * ?") //每5秒执行一次public void sing(){System.out.println("当前执行时间:"+new Date());}}
@EnableScheduling 注解的作用是发现注解@Scheduled的任务并后台执行。
@Scheduled用于标注这个方法是一个定时任务的方法
cron时间表达式是一个字符串,字符串分6个域: 秒 分 时 日 月 周
cron时间表达式一般是用百度在线生成, 不需要去记它的规则
[
](https://blog.csdn.net/weixin_42960873/article/details/106849217)
RabbitMQ实现定时任务
优点:时效性好、承受并发量大
缺点:实现复杂度高、技术要求高
Linux配置
在线拉取docker pull rabbitmq:3.8-management加载镜像docker load -i mq.tar创建容器docker run \-e RABBITMQ_DEFAULT_USER=momoda \-e RABBITMQ_DEFAULT_PASS=123321 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq:3.8-management
导包
<!--mq依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
配置
server:port: 8801spring:application:name: task-demorabbitmq:host: 192.168.200.130port: 5672virtual-host: /username: momodapassword: 123321
代码
配置类
package com.example.rabbitConfig;import org.springframework.amqp.core.*;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class MqConfig {//交换机public static final String EX_A = "exchangeA";//死信交换机public static final String EX_B = "exchangeB";public static final String Q_A = "queueA";public static final String Q_B = "queueB";public static final String ROUTING_KEY_A = "exa-qa";public static final String ROUTING_KEY_B = "exb-qb";//声明 交换机@Bean(EX_A)public Exchange EX_A() {return new FanoutExchange(EX_A, true, false);}//声明 死信交换机@Bean(EX_B)public Exchange EX_B() {return new FanoutExchange(EX_B, true, false);}//声明 队列A@Bean(Q_A)public Queue Q_A() {Queue queue = new Queue(Q_A);//设置消息过期后转入哪个交换机queue.addArgument("x-dead-letter-exchange", EX_B);return queue;}//声明 队列B@Bean(Q_B)public Queue Q_B() {return new Queue(Q_B);}//绑定队列和交换机@Beanpublic Binding binding_A() {return BindingBuilder.bind(Q_A()).to(EX_A()).with(ROUTING_KEY_A).noargs();}//绑定队列和交换机@Beanpublic Binding binding_B() {//设置KEYreturn BindingBuilder.bind(Q_B()).to(EX_B()).with(ROUTING_KEY_B).noargs();}}
生产者
package com.example.producer;import com.example.rabbitConfig.MqConfig;import org.springframework.amqp.core.Message;import org.springframework.amqp.core.MessageProperties;import org.springframework.amqp.rabbit.core.RabbitTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;@RestControllerpublic class PublishProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/publish")public String publish(){MessageProperties messageProperties = new MessageProperties();//设置过期时间 单位:毫秒messageProperties.setExpiration("1000");//设置消息Message message = new Message("HelloWorld".getBytes(), messageProperties);//放到 交换机A 对应的keyrabbitTemplate.convertAndSend(MqConfig.EX_A,"MqConfig.ROUTING_KEY_A ",message);System.out.println("消息发送时间" + LocalDateTime.now());return "OK";}}
消费者
package com.example.listener;import com.example.rabbitConfig.MqConfig;import org.springframework.amqp.core.Message;import org.springframework.amqp.rabbit.annotation.RabbitListener;import org.springframework.stereotype.Component;import java.time.LocalDateTime;@Componentpublic class PublishListener {//监听队列B@RabbitListener(queues = MqConfig.Q_B)public void publish(Message message) {System.out.println("接收消息时间" + LocalDateTime.now() + " 接收到消息" + new String(message.getBody()));}}
