当前位置:  开发笔记 > 编程语言 > 正文

Spring sseEmitter,在调用方法发送后不会立即发送事件

如何解决《SpringsseEmitter,在调用方法发送后不会立即发送事件》经验,为你挑选了0个好方法。

我试图用Spring 4(tomcat 7,servlet-api 3.0.1)发送服务器发送的事件.

问题是Events在调用方法发送后我没有发送.它们都是在超时之后同时(具有相同的时间戳)到达客户端SseEmitter,带有EventSource错误事件.然后客户端正在尝试重新连接.知道发生了什么事吗?

我创建了一个简单的服务:

@RequestMapping(value = "subscribe", method = RequestMethod.GET)
public SseEmitter subscribe () throws IOException {
    final SseEmitter emitter = new SseEmitter();
    Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            try {
                emitter.send(SseEmitter.event().data("Thread writing: " + Thread.currentThread()).name("ping"));
            } catch (Exception e) {
            }
        }
    } , 1000, 1000, TimeUnit.MILLISECONDS);
    return emitter;
}

使用客户代码:

sse = new EventSource(urlBuilder(base, url));
sse.addEventListener('ping', function (event) {
    dfd.notify(event);
});

sse.addEventListener('message', function(event){
    dfd.notify(event);
});

sse.addEventListener('close', function(event){
    dfd.notify(event);
});

sse.onerror = function (error) {
    console.log(error);
};

sse.onmessage = function (event){
    dfd.notify(event);
};

App initalizer代码

public class WebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(AppConfig.class);
        ctx.setServletContext(servletContext);
        ctx.refresh();

        ServletRegistration.Dynamic dynamic = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
        dynamic.setAsyncSupported(true);
        dynamic.addMapping("/api/*");
        dynamic.setLoadOnStartup(1);
        dynamic.setMultipartConfig(ctx.getBean(MultipartConfigElement.class));

        javax.servlet.FilterRegistration.Dynamic filter = servletContext
                .addFilter("StatelessAuthenticationFilter",
                        ctx.getBean("statelessAuthenticationFilter", StatelessAuthenticationFilter.class));
        filter.setAsyncSupported(true);
        filter.addMappingForUrlPatterns(null, false, "/api/*");

        filter = servletContext.addFilter("HibernateSessionRequestFilter",
                ctx.getBean("hibernateSessionRequestFilter", HibernateSessionRequestFilter.class));
        filter.setAsyncSupported(true);
        filter.addMappingForUrlPatterns(null, false, "/api/user/*");
    }
}

AppConfig.java

@Configuration
@ComponentScan("ru.esoft.workflow")
@EnableWebMvc
@PropertySource({"classpath:mail.properties", "classpath:fatclient.properties"})
@EnableAsync
@EnableScheduling
public class AppConfig extends WebMvcConfigurerAdapter {
...
}

我的客户日志的图片: 在此输入图像描述

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有