diff --git a/mvn/src/main/java/com/tinet/ttssc/TtsGet.java b/mvn/src/main/java/com/tinet/ttssc/TtsGet.java index b019309..fb12e37 100644 --- a/mvn/src/main/java/com/tinet/ttssc/TtsGet.java +++ b/mvn/src/main/java/com/tinet/ttssc/TtsGet.java @@ -129,7 +129,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr if(vid == 1 || vid == 3){ ttsRequest.setVid(vid); }else{ - out.append("vid只能为1(普通话)或者3(粤语)"); + out.append("vid只能为1(普通话)或者2(粤语)"); out.flush(); out.close(); return; @@ -155,10 +155,8 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr ttsRequest.setRequestTime(new Date()); ttsRequest.setText(text); ttsRequest.setHash(MD5Encoder.encode(text)); - - - String fileName = SystemSettingService.getSystemSetting(Const.TTS_CACHE_ABS_PATH).getValue() + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav"; - List list = AwsDynamoDbService.query(Const.DYNAMODB_TABLE, Const.DYNAMODB_PRIMARY_ID, ttsRequest.getHash()); + String key = ttsRequest.getVid() + "-" + ttsRequest.getHash(); + List list = AwsDynamoDbService.query(Const.DYNAMODB_TABLE, Const.DYNAMODB_PRIMARY_ID, key); if(list.size() > 0){ ttsRequest.setStartTime(new Date()); ttsRequest.setHitCache(1); @@ -200,7 +198,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr if(ttsRequest.isDone()){ String bucketName = SystemSettingService.getSystemSetting(Const.S3_BUCKET).getValue(); - String webfileName = "http://" + bucketName + "." + Const.AWS_TTS_CACHE_URL_POSTFIX + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav"; + String webfileName = "http://" + bucketName + "." + Const.AWS_TTS_CACHE_URL_POSTFIX + "/" + ttsRequest.getVid() + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav"; //System.out.println("合成完成,文件:"+webfileName + "时间=" + System.currentTimeMillis() + " thread:" + Thread.currentThread()); //System.out.println("合成完成,文件绝对路径:"+fileName); diff --git a/mvn/src/main/java/com/tinet/ttssc/TtssEngine.java b/mvn/src/main/java/com/tinet/ttssc/TtssEngine.java index c8c5b7d..29a9ce7 100644 --- a/mvn/src/main/java/com/tinet/ttssc/TtssEngine.java +++ b/mvn/src/main/java/com/tinet/ttssc/TtssEngine.java @@ -18,6 +18,7 @@ import com.tinet.ttssc.service.AwsDynamoDbService; import com.tinet.ttssc.service.AwsS3Service; import com.tinet.ttssc.service.SystemSettingService; +import com.tinet.ttssc.util.DateUtil; public class TtssEngine extends Thread{ @@ -73,70 +74,81 @@ public void run(){ try { TtsRequest ttsRequest = queue.poll(10, TimeUnit.SECONDS); if (ttsRequest != null ) { - if(ttsRequest.isValid(ttsServer)){//说明可以使用这个server转换 - running = true; - dealCount.incrementAndGet(); - threadDealCount++; - try{ - ttsRequest.setTtsServer(ttsServer); - ttsRequest.setThreadId(threadId); - ttsRequest.setStartTime(new Date()); - ttsRequest.setUuid(UUID.randomUUID().toString()); - String fileName = SystemSettingService.getSystemSetting(Const.TTS_CACHE_ABS_PATH).getValue() + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav"; - int res = jni.request(ttsRequest.getText(), fileName, ttsServer.getIp(), ttsRequest.getSpeed().intValue(), ttsRequest.getVid().intValue(), ttsRequest.getVolume().intValue()); - //System.out.println("jni.request ok res= " + res + " time=" + System.currentTimeMillis() + " thread:" + ttsRequest.getNotifyThread() + " ttsRequest:" + ttsRequest); - ttsRequest.setEndTime(new Date()); - ttsRequest.setResult(res); - //存储到数据库日志中 - TtsRequest.saveTtsLog(ttsRequest); - if (res !=0){ - failCount.incrementAndGet(); - threadFailCount++; - if(ttsRequest.getRetry() > 0){ - ttsRequest.setRetry(ttsRequest.getRetry() - 1); - ttsRequest.removeValid(ttsServer); - if(ttsRequest.hasValid()){//如果还有有效的server再丢进去,否则就丢弃了 - TtssEngine.pushRequest(ttsRequest); + //加上超时后退出机制,防止因为没有找到server最后一直卡在queue里面的情况。 + if(DateUtil.diffSecond(ttsRequest.getRequestTime(), new Date()) < ttsRequest.getTimeout()){ + if(ttsRequest.isValid(ttsServer)){//说明可以使用这个server转换 + running = true; + dealCount.incrementAndGet(); + threadDealCount++; + try{ + ttsRequest.setTtsServer(ttsServer); + ttsRequest.setThreadId(threadId); + ttsRequest.setStartTime(new Date()); + ttsRequest.setUuid(UUID.randomUUID().toString()); + String fileName = SystemSettingService.getSystemSetting(Const.TTS_CACHE_ABS_PATH).getValue() + "/" + ttsRequest.getVid() + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav"; + int res = jni.request(ttsRequest.getText(), fileName, ttsServer.getIp(), ttsRequest.getSpeed().intValue(), ttsRequest.getVid().intValue(), ttsRequest.getVolume().intValue()); + //System.out.println("jni.request ok res= " + res + " time=" + System.currentTimeMillis() + " thread:" + ttsRequest.getNotifyThread() + " ttsRequest:" + ttsRequest); + ttsRequest.setEndTime(new Date()); + ttsRequest.setResult(res); + //存储到数据库日志中 + TtsRequest.saveTtsLog(ttsRequest); + if (res !=0){ + failCount.incrementAndGet(); + threadFailCount++; + if(ttsRequest.getRetry() > 0){ + ttsRequest.setRetry(ttsRequest.getRetry() - 1); + ttsRequest.removeValid(ttsServer); + if(ttsRequest.hasValid()){//如果还有有效的server再丢进去,否则就丢弃了 + TtssEngine.pushRequest(ttsRequest); + } + } + }else{ + boolean success = false; + File tmp = new File(fileName); + if(tmp.exists()){ + FileInputStream fis = null; + fis = new FileInputStream(tmp); + Integer size = fis.available(); + System.out.println(fileName + " size=" + size); + if(size > 44){ + String s3FileName = ttsRequest.getVid() + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav"; + if(AwsS3Service.upload(fileName, s3FileName)){ + long createTime = new Date().getTime()/1000; + HashMap params = new HashMap(); + params.put("createTime", createTime); + params.put("text", ttsRequest.getText()); + params.put("vid", ttsRequest.getVid()); + String key = ttsRequest.getVid() + "-" + ttsRequest.getHash(); + if(AwsDynamoDbService.createItem(Const.DYNAMODB_TABLE, Const.DYNAMODB_PRIMARY_ID, key, params)){ + success = true; + } + } + } + fis.close(); + tmp.delete(); + } + synchronized (ttsRequest.getNotifyThread()) { + ttsRequest.setDone(success); + ttsRequest.getNotifyThread().notifyAll(); } - } - }else{ - boolean success = false; - File tmp = new File(fileName); - if(tmp.exists()){ - FileInputStream fis = null; - fis = new FileInputStream(tmp); - Integer size = fis.available(); - System.out.println(fileName + " size=" + size); - if(size > 44){ - String s3FileName = ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav"; - if(AwsS3Service.upload(fileName, s3FileName)){ - long createTime = new Date().getTime()/1000; - HashMap params = new HashMap(); - params.put("createTime", createTime); - params.put("text", ttsRequest.getText()); - if(AwsDynamoDbService.createItem(Const.DYNAMODB_TABLE, Const.DYNAMODB_PRIMARY_ID, ttsRequest.getHash(), params)){ - success = true; - } - } - } - fis.close(); - tmp.delete(); - } - synchronized (ttsRequest.getNotifyThread()) { - ttsRequest.setDone(success); - ttsRequest.getNotifyThread().notifyAll(); } } + catch (Exception e){ + e.printStackTrace(); + } + finally{ + running = false; + } + }else { + //说明这个server试过了,换下一个 + TtssEngine.pushRequest(ttsRequest); } - catch (Exception e){ - e.printStackTrace(); - } - finally{ - running = false; - } - }else { - //说明这个server试过了,换下一个 - TtssEngine.pushRequest(ttsRequest); + }else{ + ttsRequest.setResult(Const.REQUEST_RESULT_TIMEOUT);//没有找到server超时 + ttsRequest.setTtsServer(null); + ttsRequest.setEndTime(new Date()); + ttsRequest.setDone(false); + TtsRequest.saveTtsLog(ttsRequest); } } }catch (Exception e) { diff --git a/mvn/src/main/java/com/tinet/ttssc/entity/TtsRequest.java b/mvn/src/main/java/com/tinet/ttssc/entity/TtsRequest.java index 3f421d1..61e5803 100644 --- a/mvn/src/main/java/com/tinet/ttssc/entity/TtsRequest.java +++ b/mvn/src/main/java/com/tinet/ttssc/entity/TtsRequest.java @@ -43,6 +43,7 @@ public class TtsRequest implements Serializable, Comparable{ private Integer redirect; private Integer sync; private boolean done; + private Integer timeout; public String getText() { return text; @@ -191,6 +192,13 @@ public Integer getSync() { public void setSync(Integer sync) { this.sync = sync; } + + public Integer getTimeout() { + return timeout; + } + public void setTimeout(Integer timeout) { + this.timeout = timeout; + } public boolean isValid(TtsServer ttsServer){ if(validServer.contains(ttsServer)){ boolean vidValid = false; @@ -200,7 +208,7 @@ public boolean isValid(TtsServer ttsServer){ }else{ vidValid = false; } - }else if(vid==3){//粤语 + }else if(vid==2){//粤语 if (ttsServer.getVid().equals(2) || ttsServer.getVid().equals(3)){ vidValid = true; }else{ diff --git a/mvn/src/main/java/com/tinet/ttssc/inc/Const.java b/mvn/src/main/java/com/tinet/ttssc/inc/Const.java index 6afcc7b..47b1250 100644 --- a/mvn/src/main/java/com/tinet/ttssc/inc/Const.java +++ b/mvn/src/main/java/com/tinet/ttssc/inc/Const.java @@ -14,4 +14,5 @@ public class Const { public static String DYNAMODB_PRIMARY_ID = "key"; public static String AWS_TTS_CACHE_URL_POSTFIX = "s3-website.cn-north-1.amazonaws.com.cn"; + public static Integer REQUEST_RESULT_TIMEOUT=-999; } diff --git a/mvn/src/main/java/com/tinet/ttssc/init/Daemon.java b/mvn/src/main/java/com/tinet/ttssc/init/Daemon.java index 7273418..5b7c344 100644 --- a/mvn/src/main/java/com/tinet/ttssc/init/Daemon.java +++ b/mvn/src/main/java/com/tinet/ttssc/init/Daemon.java @@ -64,40 +64,15 @@ public void contextInitialized(ServletContextEvent sce) { //初始化AWS AwsS3Service.init(); AwsDynamoDbService.init(); + //初始化ttsServer + Macro.ttsServers = TtsServerService.init(); //初始化目录 - String path = SystemSettingService.getSystemSetting(Const.TTS_CACHE_ABS_PATH).getValue(); - if(StringUtil.isNotEmpty(path)){ - String cmd= "/bin/mkdir -p " + path; - System.out.println("创建目录 cmd=[" + cmd + "]"); - SystemCmd.executeCmd(cmd); - for(char i='a'; i<= 'f'; i++){ - for(int j=0; j<= 9; j++){ - cmd = "/bin/mkdir -p " + path + "/" + i + j; - System.out.println("创建目录 cmd=[" + cmd + "]"); - SystemCmd.executeCmd(cmd); - } - for(char j='a'; j<= 'f'; j++){ - cmd = "/bin/mkdir -p " + path + "/" + i + j; - System.out.println("创建目录 cmd=[" + cmd + "]"); - SystemCmd.executeCmd(cmd); - } - } - for(int i=0; i<= 9; i++){ - for(int j=0; j<= 9; j++){ - cmd = "/bin/mkdir -p " + path + "/" + i + j; - System.out.println("创建目录 cmd=[" + cmd + "]"); - SystemCmd.executeCmd(cmd); - } - for(char j='a'; j<= 'f'; j++){ - cmd = "/bin/mkdir -p " + path + "/" + i + j; - System.out.println("创建目录 cmd=[" + cmd + "]"); - SystemCmd.executeCmd(cmd); - } - } + String pathSetting = SystemSettingService.getSystemSetting(Const.TTS_CACHE_ABS_PATH).getValue(); + if(StringUtil.isNotEmpty(pathSetting)){ + mkdir(pathSetting, 1);//普通话 + mkdir(pathSetting, 2);//粤语 } - //初始化ttsServer - Macro.ttsServers = TtsServerService.init(); //启动转换线程 for(TtsServer server: Macro.ttsServers){ if(server.getActive() == 1){ @@ -122,7 +97,36 @@ public void contextInitialized(ServletContextEvent sce) { System.out.println("开启清理过期数据线程,每天清理一次"); return; } - + public static void mkdir(String path, Integer vid){ + path = path + "/" + vid;//创建普通话目录 + String cmd= "/bin/mkdir -p " + path; + System.out.println("创建目录 cmd=[" + cmd + "]"); + SystemCmd.executeCmd(cmd); + for(char i='a'; i<= 'f'; i++){ + for(int j=0; j<= 9; j++){ + cmd = "/bin/mkdir -p " + path + "/" + i + j; + System.out.println("创建目录 cmd=[" + cmd + "]"); + SystemCmd.executeCmd(cmd); + } + for(char j='a'; j<= 'f'; j++){ + cmd = "/bin/mkdir -p " + path + "/" + i + j; + System.out.println("创建目录 cmd=[" + cmd + "]"); + SystemCmd.executeCmd(cmd); + } + } + for(int i=0; i<= 9; i++){ + for(int j=0; j<= 9; j++){ + cmd = "/bin/mkdir -p " + path + "/" + i + j; + System.out.println("创建目录 cmd=[" + cmd + "]"); + SystemCmd.executeCmd(cmd); + } + for(char j='a'; j<= 'f'; j++){ + cmd = "/bin/mkdir -p " + path + "/" + i + j; + System.out.println("创建目录 cmd=[" + cmd + "]"); + SystemCmd.executeCmd(cmd); + } + } + } /** * 关闭 */