Spring mvc 4.0.5 长轮询示例

Posted

技术标签:

【中文标题】Spring mvc 4.0.5 长轮询示例【英文标题】:Spring mvc 4.0.5 long polling example 【发布时间】:2014-07-02 14:55:19 【问题描述】:

我正在尝试在春季使用 DeferedResult 实现长轮询。我正在尝试从春天开始,https://github.com/rstoyanchev/spring-mvc-chat

我正在按照字母的配置(几乎,见下文)。当我启动它时,我得到了:

HTTP 状态 500 - 请求处理失败;嵌套异常是 java.lang.IllegalStateException:必须在 servlet 和异步请求处理中涉及的所有过滤器上启用异步支持。这可以在 Java 代码中使用 Servlet API 或通过在 web.xml 中的 servlet 和过滤器声明中添加“true”来完成。

来自:StandardServletAsyncWebRequest。

我的配置类:

    public class MVCInitializer extends AbstractAnnotationConfigDispatcherServletInitializer 

    @Override
    protected Class<?>[] getRootConfigClasses () 
        return null;
    

    @Override
    protected Class<?>[] getServletConfigClasses() 
        return new Class<?>[]  WebMvcConfig.class, PresentationConfig.class, SecurityConfig.class, EmailConfig.class ;
    

    @Override
    protected String[] getServletMappings () 
        return new String[]  "/" ;
    

    @Override
    protected void customizeRegistration(Dynamic registration) 
        registration.setAsyncSupported(true);
    

    @Override
    protected boolean isAsyncSupported () 
        return true;
    




@Configuration
@EnableWebMvc
@EnableAsync
@ComponentScan (basePackages =  "com.xxx.presentation" )
public class WebMvcConfig extends WebMvcConfigurerAdapter 

    private static final Log log = LogFactory.getLog(WebMvcConfig.class);

    @Override
    public void configureAsyncSupport (AsyncSupportConfigurer configurer) 

        configurer.setDefaultTimeout(30 * 1000L);
    

    public void addViewControllers (ViewControllerRegistry registry) 
        registry.addViewController("/").setViewName("teledetailer");
    

    @Override
    public void addResourceHandlers (ResourceHandlerRegistry registry) 
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/images/**").addResourceLocations("/images/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
    

    @Bean
    public ViewResolver viewResolver () 
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");

        return viewResolver;
    

    @Override
    public void addReturnValueHandlers (List<HandlerMethodReturnValueHandler> returnValueHandlers) 
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    messageConverters.add(new StringHttpMessageConverter());
    messageConverters.add(new MappingJackson2HttpMessageConverter());
    returnValueHandlers.add(new RequestResponseBodyMethodProcessor(messageConverters));
        super.addReturnValueHandlers(returnValueHandlers);
    


我正在使用:

Java 7 雄猫 7.0.54 春季 4.0.5

任何帮助将不胜感激。缺乏像样的例子真的很令人沮丧。 p.s.如果我尝试启用异步支持的地方太多了 - 别担心,我只是想弄清楚它应该如何完成。

谢谢,希望你能帮助我。

【问题讨论】:

【参考方案1】:

在向 Rossen Stoyanchev 寻求帮助后(好人,非常感谢他!),他指出我的 web.xml 中有 springSecurityFilterChain,所以这个也需要配置为异步支持:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <async-supported>true</async-supported>
</filter>

希望对遇到同样问题的其他人有所帮助。

【讨论】:

以上是关于Spring mvc 4.0.5 长轮询示例的主要内容,如果未能解决你的问题,请参考以下文章

Tornado-长轮询_webSocket

如何在 Spring Boot 应用程序中实现长轮询 REST 端点?

卡夫卡长轮询

轮询与长轮询

如何实现基本的“长轮询”?

在vertx中实现长轮询