使用Spring事件机制实现异步的方法

 更新时间:2018年06月21日 10:37:44   转载 作者:Joepis  
这篇文章主要介绍了使用Spring事件机制实现异步的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

当把一个事件发布到Spring提供的ApplicationContext中,被监听器侦测到,就会执行对应的处理方法。

事件本身
事件是一个自定义的类,需要继承Spring提供的ApplicationEvent

@Data
public class MyEvent extends ApplicationEvent {
  private String msg;

  public MyEvent(Object source, String msg) {
    super(source);
    this.msg = msg;
  }
}

事件监听

基本方法是实现ApplicationListener接口,自定义一个监听器,实现onApplicationEvent()方法,然后添加到ApplicationContext

比如:

public class MyListener implements ApplicationListener<MyEvent> { 

  @Override 
  public void onApplicationEvent(MyEvent event) { 
    System.out.print("监听到MyEvent事件"); 
  } 
} 
...
// SpringBoot的启动类中添加监听器
    public static void main(String[] args) {
    SpringApplication application = new SpringApplication(MyApplication.class);
    application.addListeners(new MyListener());
    application.run(args);
  }

也可以使用注解@EventListener(推荐):原理就是通过扫描这个注解,创建监听器并添加到ApplicationContext

@Component
@Slf4j
public class MyEventHandler {

  @EventListener
  public void handleEvent(MyEvent event) {
    log.info("------------处理事件:{}", event.getMsg());
    try {
      Thread.sleep(5 * 1000L);
      log.info("事件1(5s)处理完成");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

}

事件发布

可以通过上下文对象的发布方法ConfigurableApplicationContext::publishEvent()来发布。

也可以实现ApplicationEventPublisherAware接口来发布(推荐)。

@Component
@Slf4j
public class EventService implements ApplicationEventPublisherAware {
  public ApplicationEventPublisher publisher;

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

  public String doEventWork(String msg) {
    log.info("------------publish event:" + msg);
    MyEvent event = new MyEvent(this, msg);
    publisher.publishEvent(event);
    return "OK";
  }
}

测试代码

@SpringBootTest
@RunWith(SpringRunner.class)
public class EventServiceTest {
  @Autowired
  private EventService service;

  @Test
  public void eventTest() {
    String msg="Java Code";
    service.doEventWork(msg);
  }
}


注意

如果2个事件之间是继承关系,会先监听到子类事件,处理完再监听父类。

// MyEvent2 extends MyEvent

@Component
@Slf4j
public class MyEventHandler {

  @EventListener
  public void handleEvent(MyEvent event) {
    log.info("------------处理事件:{}", event.getMsg());
    try {
      Thread.sleep(5 * 1000L);
      log.info("事件1(5s)处理完成");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

  @EventListener
  public void handleEvent2(MyEvent2 event) {
    log.info("------------处理事件2:{}", event.getMsg());
    try {
      Thread.sleep(10 * 1000L);
      log.info("事件2(10s)处理完成");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

当我publish一个子类事件MyEvent2时,日志如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 用Java集合中的Collections.sort方法如何对list排序(两种方法)

    用Java集合中的Collections.sort方法如何对list排序(两种方法)

    本文通过两种方法给大家介绍java集合中的Collections.sort方法对list排序,第一种方式是list中的对象实现Comparable接口,第二种方法是根据Collections.sort重载方法实现,对collections.sort方法感兴趣的朋友一起学习吧
    2015-10-10
  • 解决Android Studio安装后运行出错dose not...和Internal error...

    解决Android Studio安装后运行出错dose not...和Internal error.

    这篇文章主要介绍了解决Android Studio安装后运行出错dose not...和Internal error...的相关资料,需要的朋友可以参考下
    2017-03-03
  • Spring+SpringMVC+Hibernate项目环境搭建的步骤(图文)

    Spring+SpringMVC+Hibernate项目环境搭建的步骤(图文)

    这篇文章主要介绍了Spring+SpringMVC+Hibernate项目环境搭建的步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • spring WebSocket示例详解

    spring WebSocket示例详解

    websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,本篇文章主要介绍了spring WebSocket示例详解 ,有兴趣的可以了解一下。
    2017-01-01
  • SpringBoot+MybatisPlus+代码生成器整合示例

    SpringBoot+MybatisPlus+代码生成器整合示例

    这篇文章主要介绍了SpringBoot+MybatisPlus+代码生成器整合示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Java面向对象选择题总结归纳

    Java面向对象选择题总结归纳

    今天小编就为大家分享一篇关于Java面向对象选择题总结归纳,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java读取文件及基于正则表达式的获取电话号码功能详解

    Java读取文件及基于正则表达式的获取电话号码功能详解

    这篇文章主要介绍了Java读取文件及基于正则表达式的获取电话号码功能,结合实例形式详细分析了正则匹配操作的相关语法及电话号码匹配的原理与实现技巧,需要的朋友可以参考下
    2017-09-09
  • 解析Java的Spring框架的基本结构

    解析Java的Spring框架的基本结构

    这篇文章主要介绍了Java的Spring框架的基本结构,作者从Spring的设计角度触发解析其基础的架构内容,需要的朋友可以参考下
    2016-03-03
  • Java使用TCP套接字实现多人聊天功能详解

    Java使用TCP套接字实现多人聊天功能详解

    这篇文章主要介绍了Java使用TCP套接字实现多人聊天功能,结合实例形式详细分析了java使用socket通信实现tcp协议下的聊天功能客户端与服务器端相关实现技巧,需要的朋友可以参考下
    2019-10-10
  • Java web的读取Excel简单实例代码

    Java web的读取Excel简单实例代码

    下面小编就为大家带来一篇Java web的读取Excel简单实例代码。小编觉挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06

最新评论