首页 > 其他分享 >Springboot整合WebSocket作为服务端遇到的坑

Springboot整合WebSocket作为服务端遇到的坑

时间:2024-07-23 16:33:17浏览次数:13  
标签:WebSocket Springboot 系统 语音 import 日志 服务端 字节

最近遇到一个需求,对接某公有云上的坐席系统,需要接收人工坐席和客户对话的语音流,然后调用ASR(Automatic Speech Recognition,自动语音识别)引擎,对语音流实时转写,最后将实时转写的内容推送到kafka,供下游系统消费。

大致流程图如下:

语音流对接

标绿的系统即是我方需求对接系统。

问题: 上述前面流程都没问题,但是发现最终的转写内容总是会丢最后的一两句话。对接系统也没有错误日志。

联系坐席客服系统研发人员协助排查问题,刚开始对方的研发人员也没发现问题,对方系统也没有错误日志(是压根就没打印日志,这个是最坑的)。最后排查很久依然无法找到问题,就只能对方的测试系统和我本地的系统直接联调。对方的系统开启日志后发现有一个报错,报错如下:

2024-04-02 15:23:46.144  INFO 1 --- [tReadThread-152] c.t.c.a.rasr.client.RasrClientWebSocket  [] [] [] [] [] : rasr-web-socket onClose. message=No async message support and buffer too small. Buffer size: [8,192], Message size: [76,992]... 

该日志就很明显了,我方系统的Websocket服务端默认接收的字节流长度为8192,但是发送的字节流达到了76992,所以最后的音频流接收不到,导致最后几句话的内容丢失。

为什么只会丢失最后几句话?

原因:坐席客服系统重复发语音流的过程中语音流的长度为4096,未超过WebSocket服务端默认接收的字节流长度,所以中间过程没问题。但是最后通话结束后,坐席客服系统会把剩余所有的字节流全部发送过来,字节流的长度超过了8096,服务端不会接收该字节流导致最后的语音流丢失,且服务端没有相关错误日志。

怎么解决?

如何增加spring-sockjs-websocket服务器实现的输出缓冲区

因为是用Springboot整合Websocket,只需增加如下配置即可调整输出缓冲区:

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;

/**
 * 开启WebSocket支持
 *
 * @author wave-muly
 */
@Slf4j
@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }


    @Bean
    public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxTextMessageBufferSize(102400);
        container.setMaxBinaryMessageBufferSize(102400);
        log.info("Websocket factory returned");
        return container;
    }
}

参考链接:

How to increase output buffer for spring sockjs websocket server implementation - Stack Overflow
在spring-boot利用websocket上传文件发现的问题 | 生子当如哈士奇的小空间

标签:WebSocket,Springboot,系统,语音,import,日志,服务端,字节
From: https://www.cnblogs.com/yunt/p/18318773

相关文章

  • SpringBoot整合WebSocket实践
    简介先来看下维基百科WebSocket的简介:WebSocket是一种与HTTP不同的协议。两者都位于OSI模型的应用层,并且都依赖于传输层的TCP协议。虽然它们不同,但是RFC6455中规定:itisdesignedtoworkoverHTTPports80and443aswellastosupportHTTPproxiesandintermediaries......
  • IT实战课堂计算机毕业设计源码精品基于springboot的线上辅导班系统的开发与设计
    项目功能简介:《[含文档+PPT+源码等]精品基于springboot的线上辅导班系统的开发与设计[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!软件开发环境及开......
  • SpringBoot如何解决yml明文密码问题
    日常使用过程中,使用明文密码完全没问题,但是到了企业项目中,往往需要进行安全扫描,被安全扫描组扫到后,就必须修改。有两种思路解决安全扫描问题。方式一、密码不放在代码里密码不放在工程代码中,放到配置中心上,比如SpringCloudConfig,比如Nacos,或者apollo上。一般来说安全扫描都......
  • 深入解析 @SpringBootApplication 注解及其源码
    深入解析@SpringBootApplication注解及其源码在SpringBoot开发中,@SpringBootApplication注解几乎是每个项目的起点。它不仅简化了配置,还集成了多个核心注解。今天,我们将深入探讨这个注解的内部机制,并通过代码示例来展示其强大功能。1.@SpringBootApplication是什么?简单......
  • 智能停车场系统--前后端分离(可直接落地)使用数据:vue,springBoot,redis,mybatis,mysql等
    系统首页-统计停车车收费收费数据展示实现代码:对菜单控制代码@AutowiredprivateMenuServicemenuService;@AutowiredprivateRoleMenuServiceroleMenuService;@GetMapping("/list")publicResultlist(){List<MenuRoleVO>menuRoleList=this.menuServi......
  • 计算机毕业设计——基于SpringBoot的高并发选课系统
    基于SpringBoot的高并发选课系统私信获取完整代码项目简介本项目主要解决在高校选课场景下,保证选课系统在大量读写压力下不宕机,以及选课时尽可能提高选课QPS,给学生一个良好的选课体验,完成上述功能同时保证选课安全运行效果图其他效果图请到image文件夹中查看技术......
  • SpringBoot项目打包成war包
    1.项目场景使用SpringBoot开发项目,由于内置了Tomcat,所以项目可以直接启动,部署到服务器的时候,直接打成jar包,就可以运行了。 有时需要把项目打包放入外置的Tomcat或者TongWeb中运行,就需要把项目打包成war包,。2.实现步骤2.1将启动类的pom文件打包方式更改为war<......
  • 基于springboot的水产养殖系统
    博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实实在在的写点程序。......
  • java毕业设计-基于springboot+vue的校园二手交易系统,基于java的校园二手交易系统,基于j
    文章目录前言演示视频项目背景项目架构和内容获取(文末获取)具体实现截图前台功能管理后台技术栈具体功能模块设计系统需求分析可行性分析系统测试为什么我?关于我我自己的网站前言博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业......
  • 初用IDEA的springboot第五步
    使用日志先配置文件,在resources下新建一个log4j.properties,将以下内容粘贴进去##设置###stdout,log4j.rootLogger=all,D,E,stdout##输出信息到控制台###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appe......