Springboot 实现SSE 消息推送

方式一

 @RequestMapping(value = "/task/real/info",method = RequestMethod.GET)
    public void taskState(final HttpServletRequest request, final HttpServletResponse response)
    		throws IOException, InterruptedException {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setContentType("text/event-stream");
        response.setCharacterEncoding("UTF-8");

        final PrintWriter printWriter = response.getWriter();
        logger.info("建立服务器采集连接");
 try {
            printWriter.write("data:" + "建立连接成功" + "\n\n");
            printWriter.write("retry:500\n");
            printWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }


        messagePublishSubscribe.addListener(new AbstractMessageListener(MessageType.TOPIC,"MessageTopic") {
            @Override
            public void onMessage(String busiType, Object key, Object val, String waitMapBusiType) {

                try {
                    printWriter.write("data:" + val + "\n\n");

                } catch (Exception e) {
                    e.printStackTrace();
                }
                printWriter.write("retry:500\n");
                printWriter.flush();
                /*if(printWriter.checkError()) {
                	logger.error("客户端端口连接");
                	return ;
                }*/
            }
        });

        while (true) {
            Thread.sleep(Integer.MAX_VALUE);
        }
    }

方式二:

@RequestMapping(value ="/server/real/info", method = {RequestMethod.GET}, produces = "text/event-stream;charset=UTF-8")
    public ResponseBodyEmitter pushmemmsg() {

        final SseEmitter emitter = new SseEmitter(0L);

            do {
                try {
                	String key = redisKeyUtil.keyBuilder("statis","serverinfo");
                	logger.info("emitter push message .....");
                	Map<Object, Object> hmget = redisUtil.hmget(key);
                	
                	if(!StringUtils.isEmpty(hmget)) {
                		List<String> listInfo = new ArrayList(hmget.values());
                		 emitter.send(listInfo.toString(), MediaType.TEXT_EVENT_STREAM);
                		 logger.info("emitter push server real info .....");
                	}else {
                		logger.info("emitter push server real info empty .....");
                	}

                    
                    try {
                        Thread.sleep(2000L);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    emitter.completeWithError(e);

                    logger.info("emitter close.....");
                   
                }
                return emitter;
            } while (true);
  
    }

 

前端:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SSE Demo</title>
</head>
<body>
<div id="msg_from_server" ></div>
	<script type="text/javascript">
		if (!!window.EventSource) {
			//var source = new EventSource('http://192.168.1.68:8080/sse/push');  
			var source = new EventSource('http://192.168.1.207:20001/api/v1/message/server/real/info');  
			s = '';
			source.addEventListener('message', function(e) {
				s += e.data + "<br/>"
				document.getElementById("msg_from_server").innerHTML=s;
			});
			source.addEventListener('open', function(e) {
				console.log("连接打开.");
			}, false);
			source.addEventListener('error', function(e) {
				if (e.readyState == EventSource.CLOSED) {
					console.log("连接关闭");
				} else {
					console.log(e.readyState);
				}
			}, false);
		} else {
			alert(4);
			console.log("没有sse");
		}
	</script>
</body>
</html>

nginx:

        
             location /api/v1/message/server/real/ {
                      proxy_pass http://${PIE_NGINX_CONF_MESSAGE}:8092;
                                

                      proxy_set_header  X-Real-IP  $remote_addr;
                      proxy_set_header Cookie $http_cookie;
                      proxy_cookie_domain domino.server nginx.server;
                        proxy_buffering   off;

                      fastcgi_read_timeout 300s;
            
      }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值