首页 > 编程语言 >长见识!!!Java中除了消息队列之外,竟然还能这样实现异步任务

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

时间:2024-01-07 12:31:40浏览次数:27  
标签:异步 Java Spring springframework 长见识 事件 org import

什么是Java事件

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

事件可以用在什么地方

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

业务场景

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

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

SpringBoot中如何实现事件

步骤一:定义事件

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

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接口来发布事件。

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注解来定义一个监听器方法。

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的命令行运行器来完成。

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注解。

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应用程序。


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

标签:异步,Java,Spring,springframework,长见识,事件,org,import
From: https://blog.51cto.com/u_8865295/9133864

相关文章

  • 【Java技术深入解析】「核心技术提升」最流行的Java模拟框架Mockito入门指南(Java单元
    官方资源官方网站http://mockito.org版本介绍还在使用Mockito1.x?看看Mockito2有哪些新功能!Mockito3没有引入任何破坏性的API变动,但现在需要Java8而不是Mockito2的Java6。Mockito4删除了过时的API。Mockito5将默认mockmaker改为mockito-inline,现在需要Ja......
  • date java时间转化
    Java时间转化在Java中,时间的处理是非常常见的需求之一。我们经常需要将时间从一种格式转化为另一种格式,或者进行时间的计算和比较等操作。Java为我们提供了强大的日期和时间处理类库,可以帮助我们轻松完成这些任务。Date类和DateFormat类Java中最基本的时间处理类是java.util.Dat......
  • 【多线程】JAVA中的锁
    锁作用java中的锁是用来控制多个线程访问共享资源的方式。一般来说一个锁能够防止多个线程同时访问共享资源(读写锁,读锁是共享锁允许多个线程读共享资源)。锁的分类乐观锁:在访问资源时,认为竞争不总是存在,所以在访问共享资源时不加锁,而是在更新数据时判断共享资源是否被其他线......
  • 【Java 并发】线程同步
    目录线程同步条件对象synchronized关键字监视器volatile线程同步条件对象通常线程进入临界区,却发现需要满足某一个条件后,才能继续执行,这时,就需要使用一个条件对象,来管理那些已经获得了一个锁,但是,却不做有用工作的线程。这些条件对象经常被称为条件变量(ConditionalVariable)。......
  • Java之转换流的详细解析
     2.转换流2.1字符编码和字符集字符编码计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码......
  • Java线程同步机制
    第1章:引言大家好,我是小黑。今天咱们来聊聊并发编程,咱们经常听说并行、并发这些词,特别是在处理大量数据、高用户负载时,这些概念就显得尤为重要了。为什么呢?因为并发编程可以帮助咱们的应用程序更有效地使用计算资源,处理更多任务,提升性能。为什么要同步线程呢?想象一下,如果有多个......
  • Java并发集合详解
    第1章:引言大家好,我是小黑,在这篇博客中,咱们将一起深入探索Java中的并发集合。多线程编程是一个不可或缺的部分,它能让程序运行得更快,处理更多的任务。但同时,多线程也带来了一些挑战,尤其是在数据共享和同步方面。为了解决这些挑战,Java提供了一系列的并发集合,这些集合为处理并发数据......
  • 设计模式Java实战,彻底学会
    这是全网最强的Java设计模式实战教程。此教程用实际项目场景,结合SpringBoot,让你真正掌握设计模式。网址是:Java设计模式实战专栏介绍-自学精灵(也可以百度搜索“自学精灵”)。本设计模式专栏的威力用Java实战来介绍常用的设计模式,让你真正掌握设计模式。用项目实际场景进行设计模式......
  • JAVA - stream流汇总,求和,分组等
    求和(Sum)示例代码如下所示:List<Integer>numbers=Arrays.asList(1,2,3,4,5);intsum=numbers.stream().mapToInt(Integer::valueOf).sum();1.System.out.println("数字列表的和为:"+sum);2.分组(Grouping)示例代码如下所示:List<String>fruits=Arrays.asList(&qu......
  • Java智慧工地可视化APP信息管理平台源码
    智慧工地信息化解决方案、智慧工地信息管理平台智慧工地系统以推进施工过程管理信息化、数字化、智慧化为手段,促进第五代通信技术(5G)、大数据、智能设备、人工智能等与建筑工程管理进一步融合。智慧化工地建设全面加速,以数字技术助力建筑工地转型升级、提速增效、提档升级的成......