当前位置: 首页 > wzjs >正文

政务网站建设建议网站常用 英文

政务网站建设建议,网站常用 英文,织梦网站内容替换,山东封城最新消息2023年文章目录 背景版本约定配置文件代码使用webflux使用websocket配置文件handler基类实现类注册路由 背景 基于更复杂的情况和更高的开发要求,我们可能会遇到必须同时要使用webflux和websocket的情况。 版本约定 JDK21Springboot 3.2.0Fastjson2lombok 配置文件 &…

文章目录

  • 背景
  • 版本约定
  • 配置文件
  • 代码
    • 使用webflux
    • 使用websocket
      • 配置文件
      • handler基类
      • 实现类
      • 注册路由

背景

基于更复杂的情况和更高的开发要求,我们可能会遇到必须同时要使用webflux和websocket的情况。

版本约定

  • JDK21
  • Springboot 3.2.0
  • Fastjson2
  • lombok

配置文件

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.0</version>
</parent>
<properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><dependencies><!-- Spring Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.54</version></dependency>
</dependencies>

代码

只要引入webflux,就同时引入了websocket,不需要再次引入websocket

使用webflux

@RestController
@RequestMapping("/user")
public class UserFlux {@Autowiredprivate UserService userService;@GetMapping("/get")public Mono<Result<User>> get() {return Mono.just(Result.httpSuccess(userService.getUser()));}/*** 服务器推送** @return 由服务器决定推送多少次多少数据,推送结束前不会断开连接** @apiNote (SSE - > Server Send Event)*/@GetMapping(value = "/flux", produces = MediaType.APPLICATION_JSON_VALUE)public Flux<String> flux() {return Flux.fromStream(IntStream.range(1, 5).mapToObj(i -> {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException ignored) {}JSONObject obj = new JSONObject();obj.put("data", "hello,flux" + i);return obj.toJSONString();}));}
}

这里比较值得注意的是Flux返回值,这个返回值从性质上说有点像会自动close的websocket。我们看下这个/flux的返回值:


{"data": "hello,flux1"
}{"data": "hello,flux2"
}{"data": "hello,flux3"
}{"data": "hello,flux4"
}

注意这不是我拼接的,是调试结果就是这样。也就是说,/flux是分帧输出,具有流式的特性。

使用websocket

这里选择使用手动注册websocket而非Endpoint自动注解,主要是因为我想对handler做规范化

配置文件

@Configuration(proxyBeanMethods = false)
public class ReactiveWebSocketConfiguration {@Beanpublic WebSocketHandlerAdapter webSocketHandlerAdapter() {return new WebSocketHandlerAdapter();}
}

handler基类

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.NonNull;
import org.springframework.web.reactive.socket.WebSocketHandler;
import org.springframework.web.reactive.socket.WebSocketMessage;
import org.springframework.web.reactive.socket.WebSocketSession;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
// 强制规定基类必须有泛型约束入参出参。强制规定必须进行参数校验
@Slf4j
public abstract class BaseSocketHandler<T, R> implements WebSocketHandler {@Override@NonNullpublic Mono<Void> handle(WebSocketSession session) {String sessionId = session.getId();log.info("与sessionId:【{}】 建立连接", sessionId);Flux<WebSocketMessage> receive = session.receive();Flux<R> fluxHandled = receive.flatMap(webSocketMessage -> {String payloadAsText = webSocketMessage.getPayloadAsText();if (!JSON.isValid(payloadAsText)) {log.error("收取参数不合法:{}", payloadAsText);session.close();throw new IllegalArgumentException("参数不合法");}TypeReference<T> reference = getTypeReference();if (!check(payloadAsText, reference)) {log.error("参数校验不通过:{}", payloadAsText);session.close();throw new IllegalArgumentException("参数校验不通过");}return handler(payloadAsText, reference);}).onErrorResume(throwable -> {log.error("连接异常,即将关闭", throwable);session.close();return Mono.error(throwable);});return session.send(Mono.from(fluxHandled).map(payload -> session.textMessage(JSON.toJSONString(payload))));}public abstract boolean check(String payloadObject, TypeReference<T> typeReference);public abstract Mono<R> handler(String payload, TypeReference<T> typeReference);protected abstract TypeReference<T> getTypeReference();
}

实现类

// 这样继承基类的handler使用时非常简单不说,由于上层做了处置,还会更安全更好做日志
public class NoticeHandler extends BaseSocketHandler<User, UserInfo> {@Overridepublic boolean check(String payloadObject, TypeReference<User> userTypeReference) {User user = JSON.parseObject(payloadObject, userTypeReference);return !Objects.isNull(user.getId()) && user.getId() > 0;}@Overridepublic Mono<UserInfo> handler(String payload, TypeReference<User> typeReference) {User user = JSON.parseObject(payload, typeReference);UserInfo userInfo = new UserInfo();BeanUtils.copyProperties(user, userInfo);return Mono.just(userInfo);}@Overrideprotected TypeReference<User> getTypeReference() {return new TypeReference<>() {};}
}

注册路由

import com.xu.socket.NoticeHandler;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping;
import org.springframework.web.reactive.socket.WebSocketHandler;import java.util.HashMap;
import java.util.Map;@Component
public class ReactiveWebSocketServerHandlerMapping extends SimpleUrlHandlerMapping {public ReactiveWebSocketServerHandlerMapping() {Map<String, WebSocketHandler> map = new HashMap<>();map.put("/ws/notice", new NoticeHandler());setUrlMap(map);setOrder(100);}
}
http://www.dtcms.com/wzjs/569934.html

相关文章:

  • 网站付款方式唐山网站建设维护
  • 淘宝客网站如何备案虚拟技术对网站建设维护的影响
  • dede 网站地图怎么做建设医院网站ppt模板
  • 一个新网站关键词怎么做SEO优化浙江建设集团网站
  • 西安专业建设网站洛阳网站建设
  • 网站策划与建设阶段的推广免费logo制作软件
  • 专业房产网站建设公司计算机网站建设招聘
  • dedecms美食网站wordpress注册页面修改密码
  • 南昌公司做网站网站推广方案注意事项?
  • 长治房产网站建设学网络运营什么学校好
  • 钓鱼网站怎么做防护教程校园网组网方案设计
  • 求生之路2怎么做非官方网站北京海淀区公司
  • 宜章泰鑫建设有限公司网站广州城乡建设网站
  • 福田专业网站建设公司wordpress主题yeti1.9.2
  • 南京做网站软件软件开发文档格式
  • 哪里有网站监控工具wordpress站内计费搜索
  • 不用代码做网站html整合营销传播
  • 中国建设劳动学会是正规网站吗网站图片怎么替换
  • 网站建设基础资料百度短网址在线生成
  • 营销型手机网站建设平台系统维护要几天
  • 网站开发企业需要什么资质手机网站建设的图片
  • 重庆荣昌网站建设费用网站怎么做推广和宣传语
  • 怎么搭建局域网网站传奇手游新开服网站
  • 网站没备案怎么做广告联盟网站开发实例社区
  • 基于php做的网站下载寿光建设银行光明路网站
  • 鄞州区建设局网站wordpress 升级失败
  • 可以做软件外包项目的网站绍兴哪些公司做网站
  • 网站建设定制价格明细表端 传媒网站模板
  • 晚上必看正能量网站短视频网络平台贷款逾期不还
  • 网站制作窍门仿我喜欢网站源码免费