zoukankan      html  css  js  c++  java
  • Java-WebSocket调用报错:WebSocketClient objects are not reuseable

    我的代码

    import com.google.common.collect.ImmutableMap;
    import com.google.common.io.ByteArrayDataOutput;
    import com.google.common.io.ByteStreams;
    import com.google.gson.Gson;
    import com.xxx.web.open.service.CacheService;
    import com.xxx.web.open.util.AudioStreamHelper;
    
    import lombok.Setter;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.tuple.ImmutablePair;
    import org.java_websocket.enums.ReadyState;
    import org.java_websocket.client.WebSocketClient;
    import org.java_websocket.handshake.ServerHandshake;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import org.springframework.util.DigestUtils;
    
    import java.io.File;
    import java.net.URI;
    import java.nio.ByteBuffer;
    import java.util.Map;
    import java.util.Objects;
    import java.util.UUID;
    import java.util.concurrent.locks.ReentrantLock;
    
    /***
     * 离线语音合成
     */
    @Slf4j
    @Component("ttsService")
    public class OfflineTTSService extends WebSocketClient {
        public String textToSpeech(String text, String speakerId) throws InterruptedException {
            /***
             * 根据请求的内容计算hash值,防止请求重放,产生不必要的请求,浪费服务器资源(内存、cpu、硬盘空间)
             * hash值产生算法:
             * 1、byteArrayOf("tts")+byteArrayOf("待转换的文字")
             * 2、byteArrayOf("asr")+音频流二进制 byte[]
             * 3、byteArrayOf("merge") + 文件流 byteArray1[] + 文件流byteArray2[] + ... 文件流 byteArrayN[]
             */
            ImmutablePair<Boolean, String> result = findConversion(computeHash(text,speakerId));
    
            Boolean existed = result.getLeft();
            if(existed)
            {
                String uuid = result.getRight();
                log.warn("重复的合成请求:{}",uuid);
                return uuid;
            }
    
            synchronized (this)
            {
                if(getReadyState()==ReadyState.NOT_YET_CONNECTED) {
                    if(isClosed()) {
                        reconnectBlocking();
                    }else{
                        connectBlocking();
                    }
                }else if(getReadyState() == ReadyState.CLOSED){
                    reconnectBlocking();
                }
            }
    }

    之前的方法

    import com.google.common.collect.ImmutableMap;
    import com.google.common.io.ByteArrayDataOutput;
    import com.google.common.io.ByteStreams;
    import com.google.gson.Gson;
    import com.x.web.open.service.CacheService;
    import com.x.web.open.util.AudioStreamHelper;
    
    import lombok.Setter;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.tuple.ImmutablePair;
    import org.java_websocket.enums.ReadyState;
    import org.java_websocket.client.WebSocketClient;
    import org.java_websocket.handshake.ServerHandshake;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import org.springframework.util.DigestUtils;
    
    import java.io.File;
    import java.net.URI;
    import java.nio.ByteBuffer;
    import java.util.Map;
    import java.util.Objects;
    import java.util.UUID;
    import java.util.concurrent.locks.ReentrantLock;
    
    /***
     * 离线语音合成
     */
    @Slf4j
    @Component("ttsService")
    public class OfflineTTSService extends WebSocketClient {
        public String textToSpeech(String text, String speakerId) throws InterruptedException {
            /***
             * 根据请求的内容计算hash值,防止请求重放,产生不必要的请求,浪费服务器资源(内存、cpu、硬盘空间)
             * hash值产生算法:
             * 1、byteArrayOf("tts")+byteArrayOf("待转换的文字")
             * 2、byteArrayOf("asr")+音频流二进制 byte[]
             * 3、byteArrayOf("merge") + 文件流 byteArray1[] + 文件流byteArray2[] + ... 文件流 byteArrayN[]
             */
            ImmutablePair<Boolean, String> result = findConversion(computeHash(text,speakerId));
    
            Boolean existed = result.getLeft();
            if(existed)
            {
                String uuid = result.getRight();
                log.warn("重复的合成请求:{}",uuid);
                return uuid;
            }
    
            synchronized (this)
            {
                if(!isOpen()) {
                        connectBlocking();
                 }
            }
    }

    经过以上修改解决问题

    其他地方调用者服务

     @Autowired
    OfflineTTSService ttsService;
    @Configuration
    public class WebAppConfig extends WebMvcConfigurerAdapter {
     @Bean
        public URI serverUri() throws URISyntaxException {
            return new URI("ws://xxx.yyy.zzz.aaa:8081/test");
        }
    }
  • 相关阅读:
    如何做实时监控?—— 参考 Spring Boot 实现
    如何做实时监控?—— 参考 Spring Boot 实现
    spring boot application properties配置详解
    Jrebel 6.2.1破解
    智能社-JS -wiki
    hibernate.properties
    Tomcat 的 socket bind failed的解决方法
    js 排序 SORT 各种方法
    java EE 如何使用Eclipse启动一个项目
    2016-06-06 数组的几个重要方法
  • 原文地址:https://www.cnblogs.com/passedbylove/p/11771043.html
Copyright © 2011-2022 走看看