前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >长见识!!!Java中除了消息队列之外,竟然还能这样实现异步任务

长见识!!!Java中除了消息队列之外,竟然还能这样实现异步任务

作者头像
林老师带你学编程
发布2024-01-04 08:15:12
2340
发布2024-01-04 08:15:12
举报
文章被收录于专栏:强仔仔强仔仔

什么是Java事件

在Java中,"event"(事件)通常用于指代一种在特定条件下触发的通知或者信号。在Java编程中,事件代表着程序中发生的某种动作或改变,例如用户的交互操作、状态的转换,或者其他外部因素触发的通知。Java中的事件通常与事件监听器(Event Listener)和事件处理器(Event Handler)一起使用,以便在特定事件发生时,能够触发相应的响应和处理。

事件可以用在什么地方

事件和消息队列很像,都可以用来处理异步任务,但是虽然现在MQ中间件很盛行,但是如果系统中没有MQ中间件或者业务非常轻量级的话,可以优先考虑利用事件的方式实现。

业务场景
  • 业务中需要发送邮件的场景
  • 业务中需要发送告警通知的场景
  • 业务中需要异步执行任务的场景

在量不多,甚至非常少的情况下,可以优先考虑采用Java事件的实现方式,但是需要注意服务重启丢失的可能性,做好相关的兜底方案。

SpringBoot中如何实现事件

步骤一:定义事件

在Spring中一个事件可以由任何Java对象表示,但是通常会继承ApplicationEvent类。

代码语言:javascript
复制
import org.springframework.context.ApplicationEvent;

public class CustomSpringEvent extends ApplicationEvent {
    private String message;

    public CustomSpringEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
步骤二:定义事件发布者

事件发布者是用来发布事件的组件。在Spring中,可以很容易地通过ApplicationEventPublisher接口来发布事件。

代码语言:javascript
复制
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;

@Componentpublic
class CustomEventPublisher implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher publisher;

    @Overridepublic
    void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
    }

    public void publishCustomEvent(final String message) {
        CustomSpringEvent customSpringEvent = new CustomSpringEvent(this, message);
        publisher.publishEvent(customSpringEvent);
    }
}
步骤三:定义事件监听器

监听器会响应事件。在Spring中,通过@EventListener注解来定义一个监听器方法。

代码语言:javascript
复制
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Componentpublic class CustomSpringEventListener {
@EventListenerpublic void handleCustomSpringEvent(CustomSpringEvent event) {
        System.out.println("Handling custom Spring event. "event.getMessage());
 }
}
步骤四:触发事件

现在可以在你的应用中注入CustomEventPublisher并用它来发布事件。这可以通过REST控制器,服务类或者Spring Boot的命令行运行器来完成。

代码语言:javascript
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Componentpublic class CustomEventTrigger implements CommandLineRunner {
@Autowiredprivate CustomEventPublisher publisher;
@Overridepublic void run(String... args) throws Exception {// 发布事件
        publisher.publishCustomEvent("Hello, this is a custom Spring event!");
    }
}

这个CommandLineRunner实现会在Spring应用启动时运行,并且发布了一个自定义事件。

重要的是要记得, 如果使用异步事件处理,需要确保你的应用已经开启异步支持。你可以通过在一个配置类或启动类上使用@EnableAsync来做到这一点,并且在监听器方法上使用@Async注解。

代码语言:javascript
复制
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.context.ApplicationListener;

@EnableAsync@Componentpublic class CustomSpringEventListener implements ApplicationListener<CustomSpringEvent> {
@Override@Asyncpublic void onApplicationEvent(CustomSpringEvent event) {// 处理事件
    }
}

这样配置之后,事件监听器将会在不同的线程中异步执行,不阻塞发布事件的过程。记住,这需要你管理线程相关的资源和可能的并发问题。

将这些代码片段放入你的Spring Boot项目中的相应位置,就可以实现自定义事件的发布和处理了。记得在Spring中事件处理默认是同步的,如果你处理事件的逻辑比较耗时,或者你想要让事件处理并发进行,你应该使用@Async@EnableAsync来进行异步处理。

总结来说,Spring Framework通过ApplicationEvent类和ApplicationEventPublisher接口提供了一个简化版本的观察者模式实现,这使得应用组件能够以一种松耦合的方式进行通信。利用这个功能,你可以构建更清晰、更灵活的Spring应用程序。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Java事件
  • 事件可以用在什么地方
    • 业务场景
    • SpringBoot中如何实现事件
      • 步骤一:定义事件
        • 步骤二:定义事件发布者
          • 步骤三:定义事件监听器
            • 步骤四:触发事件
            相关产品与服务
            消息队列
            腾讯云消息队列 TDMQ 是分布式架构中的重要组件,提供异步通信的基础能力,通过应用解耦降低系统复杂度,提升系统可用性和可扩展性。TDMQ 产品系列提供丰富的产品形态,包含 CKafka、RocketMQ、RabbitMQ、Pulsar、CMQ 五大产品,覆盖在线和离线场景,满足金融、互联网、教育、物流、能源等不同行业和场景的需求。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档