123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- package com.fdage.controller;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import javax.servlet.AsyncContext;
- import javax.servlet.AsyncEvent;
- import javax.servlet.AsyncListener;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- /**
- * Created by Hb_zzZ on 2019/9/16.
- */
- @WebServlet(urlPatterns = { "/sendMessage" }, asyncSupported = true)
- @Controller
- public class SseController extends HttpServlet {
- private static final long serialVersionUID = 1L;
- private final static int DEFAULT_TIME_OUT = 10 * 60 * 1000;
- public static List<AsyncContext> actxList =new ArrayList<AsyncContext>();
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // TODO Auto-generated method stub
- resp.setContentType("text/event-stream");
- resp.setCharacterEncoding("UTF-8");
- req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);//注意这里
- AsyncContext actx = req.startAsync(req, resp);
- actx.setTimeout(DEFAULT_TIME_OUT);
- actx.addListener(new AsyncListener() {
- @Override
- public void onComplete(AsyncEvent arg0) throws IOException {
- // TODO Auto-generated method stub
- System.out.println("[echo]event complete:" + arg0.getSuppliedRequest().getRemoteAddr());
- }
- @Override
- public void onError(AsyncEvent arg0) throws IOException {
- // TODO Auto-generated method stub
- System.out.println("[echo]event has error");
- }
- @Override
- public void onStartAsync(AsyncEvent arg0) throws IOException {
- // TODO Auto-generated method stub
- System.out.println("[echo]event start:" + arg0.getSuppliedRequest().getRemoteAddr());
- }
- @Override
- public void onTimeout(AsyncEvent arg0) throws IOException {
- // TODO Auto-generated method stub
- System.out.println("[echo]event time lost");
- }
- });
- actxList.add(actx);
- // PrintWriter out = actx.getResponse().getWriter();
- // out.println("data:" + new Date().getTime()); //js页面EventSource接收数据格式:data:数据 + "\r\n"
- // out.flush();
- // new Thread(new AsyncWebService(actx)).start();
- }
- @GetMapping("send")
- @ResponseBody
- public static String send(String msg){
- //打印当前AsyncContext
- System.out.println(actxList.size());
- if(actxList.size()>0){
- for(int i = 0;i<actxList.size();i++){
- AsyncContext obj = actxList.get(i);
- PrintWriter out;
- try {
- if (obj.getTimeout()>0){
- out = obj.getResponse().getWriter();
- out.println(msg); //js页面EventSource接收数据格式:data:数据 + "\r\n"
- out.flush();
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- return "发送消息";
- }
- // class AsyncWebService implements Runnable {
- // AsyncContext ctx;
- //
- // public AsyncWebService(AsyncContext ctx) {
- // this.ctx = ctx;
- // }
- //
- // public void run() {
- // try {
- // //等待十秒钟,以模拟业务方法的执行
- // Thread.sleep(10000);
- // PrintWriter out = ctx.getResponse().getWriter();
- // out.println("data:中文" + new Date() + "\r\n"); //js页面EventSource接收数据格式:data:数据 + "\r\n"
- //
- // out.flush();
- // ctx.complete();
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
- //
- // }
- //
- // }
- }
|