https://www.cnblogs.com/jonban/p/10391339.html
优点:异步推送消息只要客户端发送异步请求就可以,不依赖客户端版本,不存在浏览器兼容问题。
一、 主要讲解技术点,异步实现服务器推送消息
二、 项目示例,聊天会话功能,主要逻辑如下:
由Logan向 Charles 发送消息,如果Charles在线,则直接发送,否则存储为离线消息。
Charles 登录后向服务端发请求获取消息,首先查询离线消息,如果有消息直接返回。没有消息则等待。
由于长时间没有消息推送,等待会超时,所以设置超时异常通知,超时则返回空内容到客户端,由客户端再次发送获取消息请求,解决超时问题。
建议先复制项目到本地工程,边测试边理解。
项目示例如下:
1. 新建Maven项目 async-push
2. pom.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.java
async-push
1.0.0
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-oauth2
2.0.0.RELEASE
org.springframework
springloaded
1.2.8.RELEASE
provided
org.springframework.boot
spring-boot-devtools
provided
${project.artifactId}
org.apache.maven.plugins
maven-compiler-plugin
1.8
1.8
UTF-8
org.springframework.boot
spring-boot-maven-plugin
repackage
3. AsyncPushStarter.java
package com.java;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 主启动类
*
* @author Logan
* @createDate 2019-02-17
* @version 1.0.0
*
*/
@SpringBootApplication
public class AsyncPushStarter {
public static void main(String[] args) {
SpringApplication.run(AsyncPushStarter.class, args);
}
}
4. SendMessageVo.java
package com.java.vo;
/**
* 发送消息封装体
*
* @author Logan
* @createDate 2019-02-17
* @version 1.0.0
*
*/
public class SendMessageVo {
/**
* 发送目标ID
*/
private String targetId;
/**
* 发送消息内容
*/
private String content;
public String getTargetId() {
return targetId;
}
public void setTargetId(String targetId) {
this.targetId = targetId;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "SendMessageVo [targetId=" + targetId + ", content=" + content + "]";
}
}
5. PushMessageVo.java
package com.java.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 推送消息封装体
*
* @author Logan
* @createDate 2019-02-17
* @version 1.0.0
*
*/
public class PushMessageVo {
/**
* 发送人ID,即消息来源
*/