我试图用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 { ... }
我的客户日志的图片: