简介
从服务器端向客户端推送数据是一个很普遍的需求,在该 SpringMVC 中主要利用了 Servlet3.0 对异步方法的支持实现,通过前端轮询获取后端的数据
实现步骤
1. 新建一个 PushService 类,实现主要推送消息的逻辑;添加如下代码
@Service
public class PushService {
private DeferredResult < String > deferredResult;
public DeferredResult < String > getAsyncUpdate() {
deferredResult = new DeferredResult < String > ();
return deferredResult;
}
// 每 5 秒执行一次
@Scheduled(fixedDelay = 5000)
public void refresh() {
if (null != deferredResult) {
deferredResult.setResult(new Long(System.currentTimeMillis()).toString());
}
}
}
2. 在 Controller 中添加方法,对 PushService 进行调用
@Controller
public class PushController {
@Resource
private PushService pushService;
@GetMapping(value = "/push", produces = "text/event-stream")
@ResponseBody
public DeferredResult<String> deferredCall() {
return pushService.getAsyncUpdate();
}
}
3. 打开项目 Web 配置,向 Servlet 添加对异步方法的支持
// 相当于配置 web.xml
public class WebInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
ctx.setServletContext(servletContext);
Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
//开启异步方法支持
servlet.setAsyncSupported(true);
}
}
4. 新建 sse.jsp,并添加如下 js 代码
<script>
$(function() {
deferred();
// 该方法会不停调用自己
function deferred() {
$.get("push",
function(data) {
console.log(data);
deferred();
});
}
});
</script>
5. 在 SpringConfig 全局配置中添加页面跳转配置,并打开对定时任务的支持
@Configuration
@EnableWebMvc
@EnableScheduling
@ComponentScan("com.review.springmvc")
public class SpringConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/sse").setViewName("/sse");
}
}