【SpringBoot高级】:Springboot与任务:异步与同步

1. SpringBoot–异步任务

在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。
两个注解:
@EnableAysnc:开启异步注解功能
@Aysnc:异步注解

在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。

1、在Service层写一个异步方法:
@Async标注方法

@Service
public class AsyncService {
    /**
     * 在Spring中,基于@Async标注的方法,称之为异步方法;
     * 这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。
     */
    @Async
    public void hello(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("处理数据中...");
    }
}

2、在Controller层调用Service层的方法:

@RestController
public class AsyncController {

    @Autowired
    AsyncService asyncService;

    @GetMapping("/hello")
    public String hello(){
        /**
         * 同步方法,需要先等待asyncService.hello()方法执行结束,才能继续向下执行 return "success";
         * 异步方法,不需要等待asyncService.hello()方法执行结束,即可执行return "success";
         */
        asyncService.hello();
        return "success";
    }
}

3、使用 @Async注解一定要开启异步注解功能,否则注解无效
主配置类上开启@EnableAsync

//开启异步注解功能
@EnableAsync
@SpringBootApplication
public class SpringbootTaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootTaskApplication.class, args);
    }
}

2、SpringBoot --定时任务

项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息。 Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor 、TaskScheduler 接口。
两个注解: @EnableScheduling:开启基于注解的定时任务 @Scheduled:定时任务

cron表达式:
在这里插入图片描述
定时任务,就是按照预定的时间去执行一些任务:

1、写一个定时任务,每周一到周六整分的时候在控制台打印hello

@Service
public class ScheduledService {
    /**
     * second(秒), minute(分), hour(时), day (日), month(月), week(周几).
     *  1、0 * * * * MON-FRI
     *      0:0秒的时候(整分的时候)
     *      *:每一分钟
     *      *:每一小时
     *      *:每一天
     *      *:每一月
     *      MON-FRI:周1到周五
     *
     *  2、0 0/5 14,18 * * ? :每天14点整,和18点整,每隔5分钟执行一次
     *  3、0 15 10 ? * 1-6   :每个月的周一至周六10:15分执行一次
     *  4、0 0 2 ? * 6L      :每个月的最后一个周六凌晨2点执行一次
     *  5、0 0 2 LW * ?      :每个月的最后一个周六凌晨2点执行一次
     *  6、0 0 2-4 ? * 1#1   :每个月的第一个周一凌晨2点到4点期间,每个整点都执行一次;
     *
     *    @Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")
     *    @Scheduled(cron = "0-4 * * * * MON-SAT")
     *    @Scheduled(cron = "0/4 * * * * MON-SAT")  //每4秒执行一次
     */
    @Scheduled(cron = "0 * * * * MON-SAT")
    public void hello(){
        System.out.println("hello ... ");
    }
}

2、使用 @Scheduled(cron = “0 * * * * MON-SAT”)注解,必须开启定时任务注解功能@SpringBootApplication

//开启基于注解的定时任务
@EnableScheduling
@SpringBootApplication
public class SpringbootTaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootTaskApplication.class, args);
    }
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka和Spring Boot可以很好地结合使用,实现消息的同步异步处理。 首先,你可以使用Spring Kafka库来集成Kafka到Spring Boot应用程序中。Spring Kafka提供了一些方便的注解和类,让你可以轻松地使用Kafka进行消息的生产和消费。 对于同步处理,你可以在你的代码中使用KafkaTemplate来发送消息,并通过get()方法等待消息的确认。这样可以确保在消息成功发送到Kafka后才继续执行后续逻辑。 示例代码如下: ```java @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topic, message); try { SendResult<String, String> result = future.get(); // 消息发送成功后的处理逻辑 } catch (InterruptedException | ExecutionException e) { // 处理异常情况 } } ``` 对于异步处理,你可以使用@KafkaListener注解来监听指定的Kafka主题,并在接收到消息时执行相应的处理逻辑。你可以根据需要将方法声明为void或者返回类型为ListenableFuture,以支持异步处理。 示例代码如下: ```java @KafkaListener(topics = "my-topic") public void receiveMessage(String message) { // 接收到消息后的处理逻辑 } @KafkaListener(topics = "my-topic") public ListenableFuture<?> receiveMessageAsync(String message) { // 异步处理消息的逻辑 return new AsyncResult<>(null); } ``` 以上是使用Spring Kafka库实现Kafka消息的同步异步处理的基本方法,你可以根据具体的业务需求进行适当调整和扩展。希望对你有所帮助!如果还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值