首页 > 其他分享 >SpringBoot中使用监听器

SpringBoot中使用监听器

时间:2024-07-27 15:57:05浏览次数:7  
标签:SpringBoot EventListener public 监听器 使用 CustomEvent message event String

1.定义一个事件

/**
 * 定义事件
 * @author hrui
 * @date 2024/7/25 12:46
 */
public class CustomEvent extends ApplicationEvent {
    private String message;

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

    public String getMessage() {
        return message;
    }
}

在监听器中可以通过 event.getSource();  来获取事件源

2.通过ApplicationEventPublisher 发布事件

@Service
public class EventPublisherService {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void publishEvent(String message) {
        CustomEvent event = new CustomEvent(this, message);
        applicationEventPublisher.publishEvent(event);
    }
}

3.通过监听器订阅事件

/**
 * 监听事件,订阅事件
 * @author hrui
 * @date 2024/7/25 12:49
 */
@Component
public class CustomEventListener {


    @Async
    //@EventListener
    //@TransactionalEventListener 有事务的监听
    @EventListener(condition = "#event.message == 'hello'") //SPEL(Spring表达式)条件监听 对象也可以用== 判断
    //@EventListener(condition = "#event.message .equals('hello') ")
    //@EventListener(condition = "#event.message.endsWith("123") ") //很多方法可以选择
    public void handleCustomEvent(CustomEvent event) {
        System.out.println(Thread.currentThread().getName());
        System.out.println("Received event - " + event.getMessage());
    }
}

第三步简单实用了@EventListener注解  如果不用就需要这么做

去实现ApplicationListerner<处理的事件>  需不需要异步自己看着办

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {

    @Override
    public void onApplicationEvent(CustomEvent event) {
        // 条件判断
        if ("hello".equals(event.getMessage())) {
            // 异步处理
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName());
                System.out.println("Received event - " + event.getMessage());
            }).start();
        }
    }
}

/**
 * @author hrui
 * @date 2024/7/25 12:51
 */
@RestController
public class ListenerController {

    @Autowired
    private EventPublisherService eventPublisherService;

    @GetMapping("/listener")
    public String listener(String message)
    {
        eventPublisherService.publishEvent(message);
        return "listener";
    }
}

标签:SpringBoot,EventListener,public,监听器,使用,CustomEvent,message,event,String
From: https://blog.csdn.net/tiantiantbtb/article/details/140686900

相关文章

  • SGLang 大模型推理框架 qwen2部署使用案例;openai接口调用、requests调用
    参考:https://github.com/sgl-project/sglang纯python写,号称比vllm、tensorRT还快暂时支持模型安装可以pip、源码、docker安装,这里用的pip注意flashinfer安装最新版,不然会可能出错误ImportError:cannotimportname‘top_k_top_p_sampling_from_probs’from‘fla......
  • 如何使用 LangChain 查看 MultiQueryRetriever 管道中的最终提示?
    我目前正在使用LangChain库开展一个项目,我想从向量数据库中检索相关文档,然后使用OllamaLLM根据这些文档生成答案。以下是我当前的实现:importlogginglogging.basicConfig()logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)#Defin......
  • 在WPF中使用WebView2详解
    MicrosoftEdgeWebView2MicrosoftEdgeWebView2 控件允许在本机应用中嵌入web技术(HTML、CSS以及JavaScript)。 WebView2 控件使用 MicrosoftEdge 作为绘制引擎,以在本机应用中显示web内容。使用 WebView2 可以在本机应用的不同部分嵌入Web代码,或在单个 We......
  • 使用 docker run 将 Python 单击选项传递给 ENTRYPOINT 会出现错误:“在 $PATH 中找不
    我有一个简单的python脚本,我想在docker容器内运行它。它打印一行消息“Hello{name}”。python脚本使用clickCLI界面来定义收件人名称,如果我直接运行它(不使用dockerrun命令),它将如下所示:pythonhello.py-nSmithDockerbuild命令:dockerbuild.-thello:1.......
  • 【微信小程序开发】API使用、自定义组件、页面实现图解超详细
    文章目录常用API消息交互消息加载转发给朋友模态对话框获取用户信息调起客户端扫码界面发起支付获取位置自定义组件创建自定义组件使用自定义组件组件生命周期组件所在页面的生命周期页面实现淘宝订单简化页面饮品订单简化页面本篇总结更多相关内容可查看常用......
  • C++多线程基本使用方式
    一、线程创建        创建线程的函数  thread t(函数名f,函数f的参数) 或者 用lambda表达式代码:#include<iostream>#include<thread>#include<vector>usingnamespacestd;voidoutput(stringinput,inta){ cout<<input<<endl; cout<<a......
  • 无法在 Fast api 中使用 SQLAlchemy 删除子表
    下面我有三个表,它们之间有多对多的关系,问题是我无法删除数据库中的用户表:“表imagesmetadata上的约束imagesmetadata_user_id_fkey取决于表用户表令牌上的约束tokens_user_id_fkey取决于表usercannot删除表用户,因为其他对象依赖于它”删除令牌和图像元数据表后删除......
  • 使用 Colab 进行 Streamlit
    我正在将Streamlit与Colab一起使用。该单元持续运行,但其共享的链接不起作用。有什么解决方案吗?我没有收到任何错误。只是链接不起作用。上图中给出了两个链接http://172.28.0.12:8501/我想在Colab上运行Streamlit应用程序。你正面临一个常见问......
  • 使用正则表达式删除Python中常见的公司名称后缀
    我正在努力删除一些公司名称中的后缀。预期结果如下:原始名称:AppleInc.SonyCorporationFiatChryslerAutomobilesS.p.A.SamsungElectronicsCo.,Ltd.清除名称:AppleSonyFiatChryslerAutomobilesSamsungElectronics到目前为止我所做的:importred......
  • Spring中使用到的设计模式及其源码分析
    前言众所周知,Spring框架是一个强大而灵活的开发框架。这不,上次的面试刚问到这些,没防住!!!因此下来总结一下。这篇文章主要介绍Spring中使用到的设计模式,自己做个面试复盘,同时希望能帮助到其他小伙伴儿们。工厂模式相信大家面试题都背过,Spring通过工厂模式来创建和管理Bean......