SpringMVC实现服务器端推送服务

简介

从服务器端向客户端推送数据是一个很普遍的需求,在该 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");
    }
}

6. 访问 http://localhost:8080/review_springMVC/sse,可查看运行结果

你可能感兴趣的:(#,springMvc,servlet)