spring事件广播机制

2023-11-09

打个比方,当我们和其他公司进行业务接口对接时,我们这边需要保存或者修改某些数据,但是保存和修改这些数据对整个流程没有太大的影响,这个时候我们应该怎么做呢?是的,我们要考虑异步去保存或者修改数据,但怎么去异步保存数据呢?这个时候我们就可以使用事件广播来做这个操作

看过spring源码的大神都知道,当我们初始化容器的过程中,我们会有initApplicationEventMulticaster()--->此方法在org.springframework.context.support.AbstractApplicationContext.refresh()中,默认情况使用的事件广播是SimpleApplicationEventMulticaster这个类,这个类中有Executor接口,感觉是不是很熟悉?提示一下,线程池。如果还不熟悉的请自行百度,我们需要手动去设置这个线程池,该怎么配置呢?请看

<!--异步事件处理
AbstractApplicationContext 初始化应用事件传播时,会从beanFactory中获取是否存在广播器,
    如果不存在则用SimpleApplicationEventMulticaster
    如果想自定义此广播器,则id='applicationEventMulticaster'-->
<bean id="applicationEventMulticaster" class="org.springframework.context.event.SimpleApplicationEventMulticaster">
    <property name="taskExecutor" ref="coreTaskExecutor"/>
</bean>

<bean id="coreTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="10"/>
    <property name="maxPoolSize" value="20"/>
    <property name="queueCapacity" value="25"/>
    <property name="threadNamePrefix" value="coreTaskExecutor"/>
</bean>

在applicationContext.xml中配置,如果使用的springboot,可以使用

@ImportResource("classpath:applicationContext.xml")

来导入xml文件

配置好了之后,我们可以定义我们自己的事件和监听器了

创建事件类,需要继承ApplicationEvent

public class TestEvent extends ApplicationEvent {

   public TestEvent(Object source) {
      super(source);
   }
}

Object对象就是我们需要传递的参数

接着,定义我们的监听,需要实现ApplicationListener这个接口

public class TestListener implements ApplicationListener {
   @Override
   public void onApplicationEvent(ApplicationEvent event) {
      if(!(event instanceof TestEvent)){
         return;
      }
      event.getSource();//获取传递的参数,即:和TestEvent中的source一样的
      //再次处理业务逻辑    TODO    
   }
}

我们主要是在监听器中处理业务逻辑

是不是想到了个问题,参数怎么传递过来的呢?别着急,我们慢慢来

参数当然是从我们正常处理业务逻辑代码中传递过来的了,监听器中的代码只是处理分支的情况,正常情况,我们一般都是在service的实现类中进行事件广播并传递参数,此类必须实现ApplicationContextAware这个接口

public class TestServiceImpl implements ApplicationContextAware{
   ApplicationContext applicationContext;

   @Override
   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
      this.applicationContext = applicationContext;
   }

   public void test(){
      String datas = "";//传递参数也可以是maplist、实体对象等
       applicationContext.publishEvent(new TestEvent(datas));
   }
}

那么在监听器中就可以接收到datas数据了,然后就可以愉快的进行代码编写了




努力成就非凡,请不要在最该奋斗的年纪选择安逸



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring事件广播机制 的相关文章

  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • Java:迭代 Collection 的最佳方法(此处为 ArrayList)

    今天 当我看到一段我已经使用了数百次的代码时 我很高兴地开始编码 迭代集合 此处为 ArrayList 出于某种原因 我实际上查看了 Eclipse 的自动完成选项 这让我想知道 在什么情况下以下循环比其他循环更好使用 经典的数组索引循环
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • 在Spring中使用什么样的“EventBus”?内置、Reactor、Akka?

    我们将在几周后启动一个新的 Spring 4 应用程序 我们希望使用一些事件驱动的架构 今年 我到处读到有关 Reactor 的内容 在网上查找时 我偶然发现了 Akka 所以现在我们有3个选择 春天的ApplicationEvent ht
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 如何安全地解决这个 Java 上下文类加载器问题?

    我的数百名用户中只有一位在启动我的 Java 桌面应用程序时遇到问题 他只有大约三分之一的时间开始 另外三分之二的时间在启动时抛出 NullPointerException Exception in thread AWT EventQueu
  • Hibernate.createBlob() 方法从 Hibernate 4.0.1 开始已弃用,并移至 Hibernate.getLobCreator(Session session).createBlob()

    Method Hibernate createBlob 已弃用自休眠4 0 1并搬到Hibernate getLobCreator Session session createBlob 任何解决方案我应该在方法内传递什么getLobCrea
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • 如何在selenium服务器上提供自定义功能?

    我知道可以通过某种方法获得一些硒功能 其中之一如下 driver getCapabilities getBrowserName 它返回浏览器名称的值 但如果它指的是一个可用的方法 如果我没有误解的话 这似乎与自定义功能有关 就像我的意思是
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • 具有特定参数的 Spring AOP 切入点

    我需要创建一个我觉得很难描述的方面 所以让我指出一下想法 com x y 包 或任何子包 中的任何方法 一个方法参数是接口 javax portlet PortletRequest 的实现 该方法中可能有更多参数 它们可以是任何顺序 我需要
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu

随机推荐

  • steam++加速问题:出现显示443端口被 vmware-hostd(9860)占用的错误。

    前言 时不可以苟遇 道不可以虚行 今天的的前言诗句特地百度搜索了一下 诗句大概的意思是 时机是不可能随便就能遇到的 道路也要一步一步踏实地行走 象征着好运的诗句 之所以特地去找这样意思的诗句 主要的原因是 今天就是四六级考试 想给自己带来一
  • 利用Python(netCDF4库)读取.nc文件(NetCDF气象数据文件)的基本操作

    NetCDF network Common Data Form 网络通用数据格式是一种面向数组型并适于网络共享的数据的描述和编码标准 目前 NetCDF广泛应用于大气科学 水文 海洋学 环境模拟 地球物理等诸多领域 用户可以借助多种方式方便
  • LeetCode--初级算法--字符串类算法

    反转字符串 题目 编写一个函数 其作用是将输入的字符串反转过来 示例 1 输入 hello 输出 olleh 示例 2 输入 A man a plan a canal Panama 输出 amanaP lanac a nalp a nam
  • flask配置https协议

    感谢https blog csdn net qq 33934427 article details 127456673 文中多有参考再实践 一 要用https协议需要有ca证书 在windows10先下载windows版本openssl 地
  • uni-app (路由)

    介绍 uni app页面路由为框架统一管理 开发者需要在pages json里配置每个路由页面的路径和页面样式 类似的小程序在app json中配置页面路由相同 所以uni app的路由用法与Vue Router不同 如仍希望采用Vue R
  • Android12及所有版本解决没有system读写权限(只需要magisk面具)

    通过magisk挂载文件的方式来修改system 不用解锁system或挂载读写 前提条件 你要确保你已经正确刷入了Magisk 刷面具保姆级别教程 举一反三 多种手机通用 这个方法实际上就相当于刷模块来达到修改的目的 本文只是给小白普及一
  • 时间同步服务chrony的简单配置

    一 chrony服务器的简介 chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件 它能让计算机保持系统时钟与时钟服务器 NTP 同步 因此让你的计算机保持精确的时间 Chrony也可以作为服务端软件为其他计算机提供时间
  • vue-router安装失败

    当安装vue router遇到以下问题 npm ERR code ERESOLVE npm ERR ERESOLVE unable to resolve dependency tree npm ERR npm ERR While resol
  • 食品PC端的轮播图的文字和图片怎么修改

  • C# Winform 窗体传值 利用委托 子窗体传值给父窗体

    常用的Winform窗体传值有两种方式 1 更改Form designer cs文件 将控件的设为Public 供子窗体访问 在designer cs文件的最后 找到你的控件声明 private System Windows Forms T
  • Qt程序打包发布方法(使用官方提供的windeployqt工具)

    Qt程序打包发布方法 使用官方提供的windeployqt工具 Qt 官方开发环境使用的动态链接库方式 在发布生成的exe程序时 需要复制一大堆 dll 如果自己去复制dll 很可能丢三落四 导致exe在别的电脑里无法正常运行 因此 Qt
  • 深入浅出理解视频编码H264结构(内涵福利)

    转自 https www jianshu com p 9522c4a7818d 在国内直播 欣欣向荣 ps 其实大多都亏钱 为的就是炒概念 的年代 相信很多小伙伴也投入了技术的浩瀚大洋当中 ps 其实就是搬砖 日复一日 音 视频的神秘面纱开
  • 区块链100篇之将fabric部署在k8s上

    有了上一篇的基础 这一篇就尝试将fabric部署在k8s上 以下的操作的前提条件是自己已经对docker compose部署fabric比较熟悉了 可以先搞清楚fabricase目录下的fabric raft项目 1 修改DNS 在真正开始
  • DS证据理论浅析

    在DS证据理论中 由互不相容的基本命题 假定 组成的完备集合称为识别框架 表示对某一问题的所有可能答案 但其中只有一个答案是正确的 该框架的子集称为命题 分配给各命题的信任程度称为基本概率分配 BPA 也称m函数 M A 为对A的信任程度大
  • 绿源电动车通过聆讯:​年营收48亿 为倪捷与胡继红家族企业

    雷递网 雷建平 9月20日 绿源集团控股 开曼 有限公司 简称 绿源电动车 日前通过聆讯 准备在香港上市 这意味着时隔近一年后 绿源电动车终于拿到了上市的钥匙 年营收47 8亿 绿源电动车创建于1997年 总部位于浙江金华 绿源产品涵盖电动
  • matlab数学建模-神经网络:测试不同隐藏层神经元的个数、更改学习函数

    目录 通过误差 和训练步数对比 确定隐含层个数 并检验隐含层个数对性能的影响 1 trainlm 算法 2 traingdm 算法 3 trainrp 算法 4 traingdx 算法 5 traincgf 算法 通过误差 和训练步数对比
  • python django设计流水号生成,带访问加锁,重试

    python django设计流水号生成 带访问加锁 重试 老规矩 技术发于业务 努力从于项目 1 设计一个流水号配置表如下 流水号配置表 class BaseSerialNum BaseModel serial type models C
  • IO性能相关

    1 IO性能解决方案整理 网卡性能优化方案 绑定中断 至特定CPU 减少接口属性设置 数据包打入CPU标签 提升缓存命中 磁盘随机读写优化方案 批量读写 寻道更快 转速更高的硬盘 内存作为缓存 SSD RAID 磁盘顺序读写优化方案 RAI
  • javascript 简单高效判断数据类型 系列函数 By shawl.qiu

    javascript 简单高效判断数据类型 系列函数 By shawl qiu 说明 前段时间把 ASP VBScript 掌握得差不多的时候 就转而学习 Javascript Jscript 主要是学 Jscript 啦 不过这两者基本上
  • spring事件广播机制

    打个比方 当我们和其他公司进行业务接口对接时 我们这边需要保存或者修改某些数据 但是保存和修改这些数据对整个流程没有太大的影响 这个时候我们应该怎么做呢 是的 我们要考虑异步去保存或者修改数据 但怎么去异步保存数据呢 这个时候我们就可以使用