IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> springboot项目实战 applicationEvent + EventListener 实现自定义监听器 -> 正文阅读

[Java知识库]springboot项目实战 applicationEvent + EventListener 实现自定义监听器

ApplicationEvent作用说明(帮助理解):
ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性

自定义Event事件

import lombok.Getter;
import lombok.Setter;
import org.springframework.context.ApplicationEvent;

import java.util.Map;

@Setter
@Getter
public class MyEvent extends ApplicationEvent {

    private Map<String, String> map;

    public MyEvent(Object source, Map<String, String> map) {
        super(source);
        this.map = map;
    }
}

Event事件处理方式

第一种 通过EventListener处理

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;


@Component
@Slf4j
public class MyEventListenerDeal {

    @EventListener
    public void handleMyEventMap(MyEvent myEvent) {
        log.info("------------handleMyEvent -----------");
        // 測試  模擬真是業務的處理
        myEvent.getMap().put("city", "beijing");
    }
}

第二种通过事件ApplicationListerner加自定义的事件进行处理

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;


@Component
@Slf4j
public class MyEventListenerDeal implements ApplicationListener<MyEvent> {

    @Override
    public void onApplicationEvent(MyEvent myEvent) {
        log.info("已经监听到开始处理!!!");
        myEvent.getMap().put("city", "河南太热了!!!");
    }
}

模拟业务层进行事件发布

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class MyEventTriggerService {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public Map<String, String> triggerMap() {
        // 模拟实际项目业务
        Map<String, String> map = new HashMap<>();
        map.put("name", "zhangting");
        map.put("city", "nanjing");

        MyEvent myEvent = new MyEvent(this, map);
        // 发布时间
        applicationEventPublisher.publishEvent(myEvent);
        return map;
    }
}

测试

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.worth.listen.MyEventTriggerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@Api(tags = "测试Controller")
@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {

    @Autowired
    MyEventTriggerService myEventTriggerService;


    @ApiOperation(value = "基金每日净值表-test1", notes = "基金每日净值表-test1")
    @GetMapping(value = "/test1")
    public ResponseEntity<?> test1(HttpServletRequest req, HttpServletResponse response) {
        log.info("----------begin-------");
        Map<String, String> map = myEventTriggerService.triggerMap();
        log.info("----------end-------");
        return new ResponseEntity<>(map, HttpStatus.OK);
    }
}

效果

在这里插入图片描述
监听之后的操作进行替换
第一种处理
在这里插入图片描述
第二种处理
在这里插入图片描述

新增SpringEvent使用(异步使用)

在这里插入图片描述
提供了两种方式进行事件发布

一种是继承 ApplicationEvent

第二种是自定义事件

自定义Event 事件参数

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Map;

@Data
@AllArgsConstructor
public class MyMsgEvent {

    public Map<String, String> map;
}

监听器异步处理

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.Map;

@Slf4j
@Component
public class MyMsgListener {

    @Async
    @SneakyThrows
    @EventListener
    public Map<String, String> sendMsg(MyMsgEvent myMsgEvent) {
        log.info("新的操作时事件");
        Map<String, String> map = myMsgEvent.getMap();
        map.put("city", "我叫宋雷雷!!!");
        Thread.sleep(60000);
        log.info("异步睡觉了!!!");
        return map;
    }
}

实际业务使用

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class MyEventTriggerService2 {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public Map<String, String> triggerMap() {
        // 模拟实际项目业务
        Map<String, String> map = new HashMap<>();
        map.put("name", "zhangting");
        map.put("city", "nanjing");

//        MyEvent myEvent = new MyEvent(this, map);
        applicationEventPublisher.publishEvent(new MyMsgEvent(map));
        // 发布时间
//        applicationEventPublisher.publishEvent(myEvent);

        return map;
    }
}
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.worth.listener1.MyEventTriggerService;
import org.jeecg.modules.worth.listener2.MyEventTriggerService2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@Api(tags = "测试Controller")
@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {

    @Autowired
    MyEventTriggerService myEventTriggerService;

    @Autowired
    MyEventTriggerService2 myEventTriggerService2;


    @ApiOperation(value = "基金每日净值表-test1", notes = "基金每日净值表-test1")
    @GetMapping(value = "/test1")
    public ResponseEntity<?> test1(HttpServletRequest req, HttpServletResponse response) {
        log.info("----------begin-------");
//        Map<String, String> map = myEventTriggerService.triggerMap();
        Map<String, String> map = myEventTriggerService2.triggerMap();
        log.info("----------end-------");
        HashMap<String, String> mao2 = new HashMap<>();
        mao2.put("我来了@@","22222");
        mao2.put("我又来了@@","3333");
        return new ResponseEntity<>(mao2, HttpStatus.OK);
    }
}

实际效果
在这里插入图片描述
在这里插入图片描述
解释一下:
在controller 重新对map进行值自定义,由于service 是异步处理,所以自定义的值是立刻返回的,在接口成功返回之后,在观察控制台,一分钟后异步任务执行完毕。

使用的业务:
客户消费完,累计积分。
分拆两部 提高接口效率:第一步处理客户消费,接口处理完之后直接返回成功,之后异步任务处理积分逻辑。
当然也可以使用Mq实现。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:07:52  更:2022-07-17 16:10:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:22:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码