spring - Spring Framework 3 中的 Starter 异步类
问题描述
如何在 spring fw 3 中创建一个从部署开始并异步运行的类?
我需要在这个类中做一个“while(true)”来使用 Kafka 主题,但目前该循环不是异步的并且没有完成,并且 war 文件没有完成部署。
我尝试在 web.xml 中使用“listener-class”和“servlet”。
任何想法?
解决方案
listener-class 和 servlet 部分都是 web 规范,与 spring 无关。特别是它们不受 spring 管理,不受应用程序上下文生命周期的约束,没有注入等等。它们基本上是由 web servlets 容器管理和调用的(比如你在设置中拥有的 tomcat 或 jetty)
一般来说,你需要了解两个概念:
- 侦听器 - 这些是在应用程序上下文加载的不同时间被调用的东西(你需要在应用程序上下文“准备好”之前加载应用程序上下文时被调用的东西)——所有的 bean 都被创建、注入,所以你可以开始消费来自那里的卡夫卡消息。
从技术上讲,侦听器是一个 bean,因此您可以注入 kafka 定义(我知道您不使用任何 spring kafka 集成并“手动”定义所有内容)...
@Async
方法。简而言之,这些是spring可以“卸载”到某个线程池的方法,这样它们就不会干扰启动应用程序上下文的主线程。如果由于某种原因在您的 Spring 版本中不支持异步方法 - 您可以自己定义一个线程池并“提交”一个在无限循环中执行 kafka 轮询的类。
因此,总而言之,您需要一个带有 async 注释的侦听器 + 为您的应用程序启用异步支持。
一些可能会派上用场的链接:
推荐阅读
- amazon-web-services - 如何从 AWS SAM 本地 docker 实例连接到主机 MySQL?
- python - 在一列中拆分多个字段
- javascript - 错误找不到“object”类型的不同支持对象“[object Object]”。NgFor 仅支持绑定到 Iterables,例如 Arrays
- php - 如何在 Widget 类中创建类
- git - git rebase 提交
- postgresql - 左连接两个表 - 不包括第二个表有超过 1 行的第一个表值的连接;拒绝
- java - OpenCV检测钻孔
- batch-file - 如何仅执行文件夹中名称以两位数开头的所有 SQL 文件,而忽略所有其他 SQL 文件?
- java - 关闭应用或切换 Fragment 时在 RecyclerView 中保存所选项目
- javascript - javascript中的Json键和值