SpringMVC实现服务器端推送服务

该文章介绍了如何在SpringMVC框架中利用Servlet3.0的异步处理特性实现服务器向客户端推送数据。主要步骤包括创建PushService进行推送逻辑处理,通过@Scheduled注解设置定时刷新,Controller中调用服务,配置WebInitializer以支持异步方法,以及在客户端使用JavaScript进行轮询请求更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

从服务器端向客户端推送数据是一个很普遍的需求,在该 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,可查看运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值