SpringBoot使用SSE流,打tar包发版后出现问题

守听  金牌会员 | 2025-1-24 13:06:11 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 873|帖子 873|积分 2619

SpringBoot使用SSE流,打tar包发版后出现问题

以下纯个人实践,如有问题,还望指正~
出现的问题

出现原因:本地调试SSE推送数据没有问题,但是通过打包为tar包发版之后,出现了以下报错:
主要问题就是:
java.lang.IllegalArgumentException: Async support must be enabled on a servlet and for all filters involved in async request processing. This is done in Java code using the Servlet API or by adding "true" to servlet and filter declarations in web.xml.
贴张图:

着实这个问题已经说的很明白了,去web.xml文件加上即可,但问题在于这是SpringBoot项目,配置web.xml有点离谱了,于是网络搜索办理方案加上SpringBoot就会得到这些结果:
方案1:给启动类加上注解
  1. @WebFilter(urlPatterns = { "/*" }, asyncSupported = true)
复制代码
本人项目实测没用,但有人成功过,列在这里
方案2:加过滤器
  1. @Component<br>public class AsyncSupportFilter extends OncePerRequestFilter {<br>    @Override<br>    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {<br>        request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, true);<br>        chain.doFilter(request, response);<br>    }<br>}
复制代码
这个里面就能看出来,还是在尝试启用asyncSupported,但我这边实测还是不可
那么提供终极的办理办法,个人亲测可用,不排除个例问题 ,仅供参考
实现方案:
  1. /**<br> * 异步请求支持过滤器配置类<br> * 用于启用 Servlet 异步处理功能<br> * @author houjinbao<br> */<br>@Configuration<br>public class AsyncSupportFilter {<br>    <br>    /**<br>     * 注册异步请求过滤器的 Bean<br>     * @return FilterRegistrationBean 过滤器注册对象<br>     */<br>    @Bean<br>    public FilterRegistrationBean<AsyncRequestFilter> asyncFilterRegistration() {<br>        // 创建过滤器注册对象<br>        FilterRegistrationBean<AsyncRequestFilter> registration = new FilterRegistrationBean<>();<br>        // 设置使用的过滤器<br>        registration.setFilter(new AsyncRequestFilter());<br>        // 设置过滤器匹配的 URL 模式,/*表示匹配所有请求<br>        registration.addUrlPatterns("/*");<br>        // 启用异步支持<br>        registration.setAsyncSupported(true);<br>        // 设置过滤器的优先级为最高<br>        registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE);<br>        return registration;<br>    }<br>    <br>    /**<br>     * 异步请求过滤器实现类<br>     * 继承 OncePerRequestFilter 确保每个请求只经过一次过滤器<br>     */<br>    private static class AsyncRequestFilter extends OncePerRequestFilter {<br>        @Override<br>        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) <br>                throws ServletException, IOException {<br>            // 设置请求属性,启用 Tomcat 的异步处理支持<br>            request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);<br>            // 继续执行过滤器链<br>            chain.doFilter(request, response);<br>        }<br>    }<br>}
复制代码
记得启动类加上@EnableAsync
其他方案:
方案4(不保真):

有外国老哥测试,可在TomCat文件里面去修改,配置TomCat的web.xml文件,也可实现
原文:stack overflow 文章

 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表